;;; Copyright (c) 1999 Massachusetts Institute of Technology
;;;
;;; This program is free software; you can redistribute it and/or
;;; modify it under the terms of the GNU General Public License as
;;; published by the Free Software Foundation; either version 3 of the
;;; License, or (at your option) any later version.
;;;
;;; This program is distributed in the hope that it will be useful,
;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
;;; General Public License for more details.
;;;
;;; You should have received a copy of the GNU General Public License
;;; along with this program; if not, see https://gnu.org/licenses or
;;; write to:
;;;  Free Software Foundatiom, Inc.
;;;  51 Franklin St, Fifth Floor
;;;  Boston, MA 02110-1301
;;;  USA

; I T S MISCELLANEOUS DEVICES

IFN PTRP,[

SUBTTL	PAPER TAPE PUNCH ROUTINES

PTPO:	JSP Q,STDOPN
	7,,PTPUSR
	PTPA,,PTPB
	PTPWA,,PTPWB
	PTPI,,0
	PTPI,,0

BPIPUN:	JSP E,NBTOCH
	CAIN A,EOFCH
	POPJ P,
	JRST APIPU2

APIPUN:	SKIPGE C
	 SKIPA A,(C)
	  UMOVE A,(C)
	ANDI A,177
APIPU2:	CAIN A,14
	 JRST PUNFF
	TRO A,200
	JRST PIPUN3

PIPUN:	SKIPGE C
	 SKIPA A,(C)
	  UMOVE A,(C)
PIPUN3:	SKIPG PUNCC
	 JRST PUNW1
PIPUN2:	IDPB A,PUNIP
	HRRZ A,PUNIP
	CAIN A,PUNBE-1
	MOVEI A,PUNBO
	HRRM A,PUNIP
	SOS PUNCC
PUNST:	SKIPGE PUNNT
	POPJ P,	;PUNCH OUT OF TAPE
	CONSO PTP,7
	CONO PTP,10+PCHCHN
	POPJ P,

	PUSHJ P,PUNW2
PUNW1:	PUSHJ P,UFLS
	JRST PIPUN2

PUNW2:	SKIPG T,PUNCC
	POPJ P,
	CAIL T,PUNSIZ*2
	JRST POPJ1
	JRST POPJ3

PUNFF:	MOVEI T,55
	CAMLE T,PUNCC
	PUSHJ P,UFLS
	MOVSI B,-4
	PUSHJ P,PUNFF2
	MOVEI A,214
	PUSHJ P,PIPUN2
	MOVSI B,-50
PUNFF2:	MOVEI A,0
	PUSHJ P,PIPUN2
	AOBJN B,PUNFF2
	POPJ P,

WBPIPN:	JSP Q,WRDBT
WAPIPN:	MOVEI T,6
	CAMLE T,PUNCC
	PUSHJ P,UFLS
	SKIPGE C
	 SKIPA B,(C)
	  UMOVE B,(C)
	MOVSI E,-6
WPIPN2:	MOVEI A,2
	LSHC A,6
	PUSHJ P,PIPUN2
	AOBJN E,WPIPN2
	POPJ P,

PBRK1:	MOVEI A,PUNSIZ*4-4
	CAMG A,PUNCC
	JRST PUNSTP
	CONSZ PTP,100	;CHECK NO TAPE FLAG
	JRST PBRK2	;PUNCH OUT OF TAPE
	ILDB A,PUNOP
	DATAO PTP,A
	HRRZ A,PUNOP
	CAIN A,PUNBE-1
	MOVEI A,PUNBO
	HRRM A,PUNOP
	AOSA PUNCC
PUNSTP:	CONO PTP,0
	JRST LPBKRT

PBRK2:	SETOM PUNNT	;PTP OUT OF TAPE
	JRST PUNSTP

;PTP SLOW CLOCK ROUTINE
PTPCHK:	SKIPGE PUNNT
	CONSZ PTP,100
	POPJ P,
	HRRZM P,PUNNT
	JRST PUNST	;PTP HAS TAPE NOW

EBLK

PUNNT:	105	;-1 => PTP OUT OF TAPE
PUNCC:	PUNSIZ*4-4
PUNIP:	(1000)PUNBO-1
PUNOP:	(1000)PUNBO-1
PUNBO:	BLOCK PUNSIZ
PUNBE:

BBLK

PUNCLR:	MOVEI A,PUNSIZ*4-4
	MOVE B,PUNIP
	MOVEM A,PUNCC
	MOVEM B,PUNOP
	POPJ P,

PUNFIN:	MOVE T,PUNSIZ*4-4	;.CALL FINISH
	CAMLE T,PUNCC
	 PUSHJ P,UFLS
	POPJ P,

AFEED:	HRRZ A,(R)
	CAIL A,PTPI	;LOWEST PTP DEV #
	CAILE A,PTPWB	;HIGHEST PTP DEV #
	POPJ P,	;PTP NOT OPEN ON CHNL
	MOVEI A,0
	PUSHJ P,PIPUN3
	JRST POPJ1

SUBTTL	PAPER TAPE READER ROUTINES

	PTRCHX==10	;NUMBER OF CHARACTERS IGNORED AT END OF TAPE

PTRO:	PUSH P,[PTRO1]	;SO STDOPN WILL RETURN
	JSP Q,STDOPN
	7,,PTRUSR
	REDUAI,,REDBAI	;ASCII MODE
	REDUII,,REDBII	;IMAGE MODE
	REDUTI,,0	;ALL 8 HOLES MODE
	REDUTI,,0	;" " " "

		;RETURN FROM STDOPN
PTRO1:	POPJ P,		;OPEN LOST
	AOS (P)		;OPEN WON, MAKE RETURN SKIP
	SKIPE PTRUSE
	POPJ P,		;READER ALREADY OPEN, DON'T RESET
			;READER NOT ALREADY OPEN, SO
		;RESET PTR POINTERS AND START UP READER
	CONO PI,PTROFF	;INHIBIT INTERRUPTS
	MOVEI T,20	;BUSY FLAG
	PUSHJ P,PTRST	;START UP READER IF NOT ALREADY RUNNING
		;RESET PTR BUFFER POINTERS
PTRZAP:	MOVE A,[041000,,PTRBUF-1]	;BUFFER BYTE POINTER
	MOVEM A,PTRIP	;BUFFER INPUT (INTERRUPT) POINTER
	MOVEM A,PTROP	;BUFFER OUTPUT (IOT) POINTER
	MOVEI A,PTRCHX	;REINITIALIZE CHARACTER COUNT
	MOVNM A,PTRCC	;" " "
	CONO PI,PTRON	;RE-ENABLE INTERRUPTS
	JRST PTRSIW	;RESET STATUS OF IMAGE WORD AND RETURN

		;CLOSE CHANNEL ON WHICH PTR OPEN

PTRCLS:	CONO PI,PTROFF	;INHIBIT INTERRUPTS
	SOSL PTRUSE	;DECREMENT USE COUNTER
	JRST PTRONJ	;PTR OPENED ON MORE CHANNELS
	SETOM PTRUSR	;NO MORE OPENS ON READER, INDICATE NO USER
	SETOM PTRDIE	;EVENTUALLY TURN OFF READER
	JRST PTRZAP	;RESET BUFFER STATUS

PTRRS:	CONO PI,PTROFF	;PTR .RESET ROUTINE
	JRST PTRZAP

		;BLOCK ASCII INPUT

PTRBAI:	JSP E,INBTCH	;DO IT A CHARACTER AT A TIME

		;GET AN ASCII CHARACTER IN W

PTRUAI:
PTRCHA:	PUSHJ P,PTRCH	;GET CHARACTER - SKIPS IF EOF.
	TRZA W,200	;CLEAR 200 BIT
	 JRST POPJ1
	JUMPE W,PTRCHA	;IF RESULT ZERO THEN DON'T CALL IT ASCII
	CAIN W,177	;IF RUBOUT,
	 JRST PTRCHA	;THEN IGNORE IT
	POPJ P,		;ASCII, USE IT

PTRBII:	JSP W,WRDBTI	;BLOCK IMAGE INPUT.

		;UNIT IMAGE INPUT
		;END-OF-FILE GIVES SIXBIT /######/

PTRUII:	PUSHJ P,PTRCH	;GET CHARACTER
	 TRNE W,200
	  CAIA		;CALL IT BINARY IF 200 SET, OR IF EOF.
	   JRST PTRUII
	IDPB W,PTRIBP
	JUMPL W,PTRUI2	;IF REACHED EOF, SKIP 1 OR 2.
	SOSLE PTRICC	;IF WORD NOT FULL,
	 JRST PTRUII	;THEN GO BACK FOR MORE
	JRST PTRUI1	;ELSE RETURN THE WORD.

PTRUI2:	SOSG B,PTRICC
	 JRST PTRUI3
	CAIE B,5
	 JRST PTRUII
	JRST PTRUI4

PTRUI3:	AOS (P)		;IF WE REACHED EOF, SKIP TWICE.
PTRUI4:	AOS (P)		;REACHED EOF BEFORE WORD; SKIP ONCE.
PTRUI1:	MOVE W,PTRIW	;WORD FULL,
PTRSIW:	MOVEI B,6	;NOW REINITIALIZE POINTERS TO WORD
	MOVEM B,PTRICC	;CHARACTER COUNT OF WORD
	MOVE B,[440600,,PTRIW]	;POINTER TO WORD
	MOVEM B,PTRIBP
	POPJ P,

		;GET A CHARACTER IN W OR SKIP RETURNING -1,,EOFCH IF NONE AVAILABLE

PTRUTI:		;UNIT MODE ALL-HOLES INPUT.
PTRCH:	MOVEI T,20	;BUSY FLAG
	PUSHJ P,PTRCHW	;WAIT FOR A CHARACTER
	 PUSHJ P,UFLS
	SOSGE I,PTRCC	;DECREMENT CHARACTER COUNT
	 JRST PTRCH1	;BUFFER EMPTY
	MOVEI T,10	;DONE FLAG
	CAIGE I,REDSIZ-PTRCHX	;IF BUFFER LESS THAN 1/4-FULL,
	 PUSHJ P,PTRST	;THEN MAKE SURE READER RUNNING
	ILDB W,PTROP	;GET CHARACTER
	HRRZ B,PTROP	;RING THE BUFFER
	CAIL B,PTRBUF+REDSIZ-1
	 MOVEI B,PTRBUF
	HRRM B,PTROP
	POPJ P,

		;END-OF-FILE ENCOUNTERED DURING PTRCH

PTRCH1:	AOS PTRCC	;RESTORE CHARACTER COUNT TO ITS ORIGINAL STATE
	JRST UNIEOF

		;SKIP IF CHARACTER IN BUFFER OR END-OF-TAPE

PTRCHW:	SKIPG PTRCC	;IF CHARACTER IN BUFFER,
	CONSO PTR,400	;OR POWER IS OFF,
	JRST POPJ1	;THEN EXIT SKIPPING
			;OTHERWISE,
		;MAKE SURE READER RUNNING

PTRST:	CONSZ PTR,7
	CONSO PTR,30	;IF RUNNING,
	JRST .+2
	POPJ P,		;THEN THAT'S ALL
	CONO PTR,PTRCHN(T)	;NOT RUNNING, RESTART WITH SELECTED FLAG
	SETOM PTRDIE	;LET SLOW CLOCK FIGURE OUT IF THERE'S TAPE
	POPJ P,

		;PTR INTERRUPT ROUTINE

PTRBRK:	AOSN PTRSTP	;IF READER SHOULD BE STOPPED THIS BREAK,
	JRST PTRFUL	;THEN STOP IT (BUFFER FULL)
	DATAI PTR,A	;GET CHARACTER
	SETOM PTRDIE	;TELL SLOW CLOCK THAT BREAK HAS HAPPENED
	IDPB A,PTRIP	;PUT IN BUFFER
	HRRZ A,PTRIP	;RING THE BUFFER
	CAIN A,PTRBUF+REDSIZ-1
	MOVEI A,PTRBUF
	HRRM A,PTRIP
	AOS A,PTRCC	;TOTAL CHARACTER COUNT-PTRCHX
	CAIGE A,REDSIZ*4-10-PTRCHX
	JRST LPBKRT
	SETOM PTRSTP	;STOP READER AT NEXT BREAK
	JRST LPBKRT

PTRFUL:	CONO PTR,PTRCHN	;BUFFER FULL, STOP READER
	MOVEI A,1	;TELL SLOW CLOCK...
	MOVEM A,PTRDIE	;NOT TO TURN IT OFF
	JRST LPBKRT

		;SLOW CLOCK ROUTINE
		;CHECKS READER EVERY HALF-SECOND

PTRCHK:	AOS A,PTRDIE
	CAIN A,1	;IF UNINTENTIONALLY STOPPED FOR OVER HALF-SECOND
	CONO PTR,400	;THEN TURN THE READER OFF
	POPJ P,

EBLK
		;PTR VARIABLES

PTRDIE:	-264		;END-OF-TAPE DETECTION
PTRSTP:	0		;-1 => STOP READER AT NEXT BREAK (SET DURING BREAK WHEN BUFFER FULL)
PTRIP:	041000,,PTRBUF-1	;BUFFER INPUT (INTERRUPT) POINTER
PTROP:	041000,,PTRBUF-1	;BUFFER OUTPUT (IOT) POINTER
PTRBUF:	BLOCK REDSIZ	;READER BUFFER
PTRCC:	-PTRCHX		;NUMBER OF CHARACTERS IN BUFFER -PTRCHX

PTRIW:	0		;CURRENT WORD FOR IMAGE MODE
PTRIBP:	440600,,PTRIW	;POINTER TO CURRENT WORD
PTRICC:	0		;CHARACTER COUNT TO CURRENT IMAGE MODE WORD

BBLK

]		;END OF IFN PTRP

SUBTTL	LINE PRINTER ROUTINES

IFN NLPTP,[
NLPTO:	MOVE A,UTMPTR(U)
	SKIPGE NLUSR
	SKIPL TTYTYP-USRRCE(A)
	 JRST TPLO
	SETOM NLFREE
	MOVEI T,LPTBSZ
	CAME T,NLPTBR	;WAIT TILL LPT BUFFER IS EMPTY.
	 PUSHJ P,UFLS
	CONSZ NLPT,207	;AND LPT ISN'T STILL PRINTING LAST WD
	 PUSHJ P,UFLS
	PUSH P,[NLPTO1]
	JSP Q,STDOPN
	1,,NLUSR
	NLPTDN,,NLPTBN

NLPTO1:	POPJ P,		;LPT NOT AVAIL & NOT ASSIGNED.
			;LPT ASSIGNED, INIT IT.
	CONO NLPT,1000	;PUT LPT INTERFACE IN IMAGE MODE,
	DATAO NLPT,[23*2]	;TURN ON THE LPT'S MOTOR.
	MOVEI I,1000
	CONSZ NLPT,200	;WAIT TILL IT IS ON.
	 SOJG I,.-1
	AOS (P)
NLPTO3:	HRROI I,NLPTCF
	HRROI C,I
	PUSHJ P,BNLPTO	;CAN'T PCLSR SINCE BUFFER IS EMPTY.
	HRRZ I,NLPTBP
	HRLI I,010700
	MOVEM I,NLPTIP
	POPJ P,

NLPTCF:	15_29.+14_22.+177_15.+177_8+177_1
]

IFN GLPTP,[	;GOULD ELECTROSTATIC PRINTER ROUTINES

IFE DL10P,.ERR GOULD PRINTER WITHOUT A PDP11 TO RUN IT?

;OPEN ROUTINE

GLPTO:	SKIPE GLPTER
	 JRST OPNL7	;DEV NOT READY IF 11 UNHAPPY
	MOVEI Q,[1,,LPTUSR
		 GLPTDN,,GLPTBN]
	PUSHJ P,STDOPN
	 POPJ P,
	SETZM GLPGRF
	TLNE C,10	;BIT 3.4 => GRAPHICS MODE.
	 SETOM GLPGRF
	JRST POPJ1






;IOT ROUTINES

	SKIPA T,[SIOKT]	;SIOT HANDLER = UNIT HANDLER MINUS ONE
GLPTDO:	 MOVEI T,CHRKTO
	MOVE E,[440700,,5]
	JRST GLPTOO

GLPTBO:	MOVEI T,BLKT
	MOVE E,[444400,,1]
GLPTOO:	JSP B,(T)
	SETZ GLPMPP
	GLPMPC
	GLPBGB
	GLPBWW
	JRST 4,.
	SKIPE GLPTBC

;CLOSE ROUTINE

GLPCLS:	SKIPE GLPMPP		;IF THERE'S AN UN-SENT BUFFER,
	 PUSHJ P,GLPBWW		;BARK AT THE PDP11
	SKIPE GLPTBC		;WAIT FOR ALL BUFFERED STUFF TO BE SENT
	 PUSHJ P,UFLS
	PUSHJ P,GLPBG0		;AVOID IOCERR AT NEXT OPEN
	IRPS CH,,12 14 177 105
	 MOVE C,[SETZ I]	;AT CLOSE SEND FF, EOF
	 MOVEI I,CH		;THIS CAN'T PCLSR ONCE IT GETS A NEW BUFFER.
	 PUSHJ P,GLPTDO
	 TERMIN
	SETZM GLPGRF
	PUSHJ P,GLPBWW		;WRITE LAST BUFFER
	SETOM LPTUSR
	SETOM LPTUSE
	POPJ P,

;BUFFER GET ROUTINE

GLPBGB:	SKIPE GLPTER
	 JRST IOCER1		;DEV NOT READY IF 11 UNHAPPY ABOU IT.
	SKIPE GLPTBC
	 POPJ P,		;BUFFER BUSY
GLPBG0:	MOVEI TT,GLPTBF
	MOVEI J,GLPBSZ
	JRST SIOBGX

;BUFFER DISCARD ROUTINE

GLPBWW:	MOVE D,[450000,,GLPTBF-1]	;DL10 BYTE POINTER (7-BIT BYTES)
	SKIPE J,GLPGRF
	 HRLI D,340000		;GRAPHICS MODE => 8-BIT BYTES
	MOVEM D,GLPTBP
	SKIPN D,GLPMPP		;COMPUTE # CHARS IN BUFFER
	 POPJ P,
	JUMPL D,[SOJA D,GLPBW1]
	MOVEI TT,15		;INDEPENDENT OF E, BLOCK VS UNIT, ETC.
	TLNE D,760000
	 JRST [ IDPB TT,D ? JRST .-1 ]
GLPBW1:	MOVEI D,-GLPTBF+1(D)
	IMUL D,[4 ? 5]+1(J)	;GRAPHICS => 4, ELSE 5.
	MOVEM D,GLPTBC		;START THE PDP11
	SETZM GLPMPP		;FLAG THAT BUFFER IS NOT ACTIVE AT M.P. LEVEL
	SETZM GLPMPC
	POPJ P,

;NOTE:  TPL CODE HAS DELIBERATELY BEEN OMITTED.
;THE DL10 LIMITS THE BUFFER SIZE TO 256 WORDS.  WITH THIS SMALL
;A BUFFER THE SYSTEM JOB CAN'T DRIVE THE PRINTER AT FULL SPEED
;BECAUSE IT CAN ONLY IOT ONCE A SECOND OR SO.
;ANYWAY, THE NECESSARY TPL CODE IS HAIRY.
]	;END IFN GLPTP

IFN OLPTP,[

LPTLPP==60.

LPTO:	CAMN U,OLUSR
	JRST LPTO2	;ALREADY HAS IT
	MOVE A,UTMPTR(U)	;GET POINTER TO USER RESOURCE
			;(TTY DEPENDANT)
	SKIPL TTYTYP-USRRCE(A)
	JRST TPLO
LPTO2:	PUSH P,[LPTO1]
	JSP Q,STDOPN
	1,,OLUSR
	LPTDN,,LPTBN

LPTO1:	POPJ P,		;OPEN LOST
	SKIPE OLUSE	;OPEN WON
	JRST POPJ1	;NOT FIRST OPEN BY THIS USER
	AOS (P)
LPTRS2:	MOVEI A,15	;ENTRY FROM LPTRS, DUMP OUT CRUD ON THIS LINE THEN FORM FEED
	PUSHJ P,PILPT
	MOVEI A,14
	JRST PILPT

BLPTO:	MOVEI E,PILPT
	JRST NBTOCH

PILPT1:	SKIPGE C
	 SKIPA A,(C)
	  UMOVE A,(C)
	ANDI A,177
PILPT:	CAIN A,177
	POPJ P,		;IGNORE RUBOUTS
	MOVEI T,130.	;LPTCC COMPARED WITH 132. BY SYSTEM JOB BEFORE TRY OF .OPEN
	CAMLE T,LPTCC
	JRST LPTW1	;WAIT
LPTIM:	CAIGE A,40
	JRST LPTRC
	CAIL A,140
	SUBI A,40
LPTIM2:	AOSN LPTBSF
	PUSHJ P,LPC	;PRINT PREV STUFF AND SPACE OVER
	AOS T,LINEPOS
BADCOL:	CAIN T,-1	;PATCH NUM OF BAD COL IN HERE WHEN NECESSARY
	JRST LPTBC1
	CAILE T,120.
	JRST PILPT2
LPC1:	SUBI A,40
	IDPB A,LPTIP
	HRRZ A,LPTIP
	CAIN A,LPTBE-1
	MOVEI A,LPTBO
	HRRM A,LPTIP
	SOS LPTCC
	CONSO OLPT,7
	CONO OLPT,LPTCHN
	POPJ P,

LPTBC1:	PUSH P,A
	MOVEI A,40
	PUSHJ P,LPC1
	POP P,A
	JRST LPC1

LPTRC:	CAIN A,10
	JRST LPTBS	;BACK SPACE
	CAIN A,11
	JRST LPTTAB
	CAIN A,12
	JRST LPTLF
	CAIN A,14
	JRST LPTFF
	CAIN A,EOFCH
	JRST LPTEOF
	SETOM PCL
	CAIE A,15
	JRST LPTRCH
LPT.CR:	SETZM LINEPOS
	SETZM LPTBSF
	JRST LPC1

	PUSHJ P,LPTW2
LPTW1:	PUSHJ P,UFLS
	JRST LPTIM

LPTW2:	CAMLE T,LPTCC
	POPJ P,
	MOVE T,LPTCC
	CAIL T,<LPTBE-LPTBO>*2
	JRST POPJ1
	JRST POPJ3

LPTBS:	SKIPG LINEPOS
	POPJ P,	;AT BEG OF LINE, IGNORE
	SOS LINEPOS
	SETOM LPTBSF
	POPJ P,

LPTRCH:	CAIN A,33
	JRST LPTALT
	MOVE B,A
	MOVEI A,"^
	PUSHJ P,LPTIM2
	MOVEI A,100(B)
	JRST LPTIM2

LPTALT:	MOVEI A,"$
	JRST LPTIM2

PILPT2:	SOS LINEPOS
	POPJ P,

LPTEOF:	SKIPE OLUSR
	POPJ P,
	SUB P,[1,,1]	;SYSTEM JOB HACKING  SO CLOBBER TO EOF
	XCTR XRW,[CLEARM (C)]
	POPJ P,

LPTCLS:	SKIPLE OLUSE	;LPT CLOSE, IS THIS THE ONLY CHANNEL LPT OPEN ON
	JRST LPTCL3
	SKIPN LINEPOS	;THIS IS LAST CLOSE, CHECK TO SEE IF LOSER LEFT POSITION SCREWED
	SKIPE LPTPPS
	PUSHJ P,LPTCL2	;INCREMENT TO NEXT PAGE
	MOVEI T,SCRTPC
	IORM T,SUPCOR	;LOOK FOR TPL FILES TO PRINT
	SETOM OLUSR	;DO THIS FIRST SO DONT NEED CLOCK OFF LPT HACKED BY ONE JOB AT A TIME
LPTCL3:	SOS OLUSE	;DECREMENT USE COUNT
	POPJ P,

LPTCL2:	MOVEI A,100.
	CAMLE A,LPTCC
	POPJ P,	;NO ROOM FORGET IT
	MOVEI A,15
	PUSHJ P,LPTIM
	MOVEI A,14
	JRST LPTIM
LPTTAB:	PUSHJ P,LPTS
	LDB J,[300,,LINEPOS]
	JUMPE J,CPOPJ
	JRST .-3

LPTS:	MOVEI A,40
	JRST LPTIM2

LPTLF:	AOS J,LPTPPS	;LINE FEED, INCREMENT LINE #
	CAIL J,LPTLPP	;END OF PAGE?
LPTFF:	SETZM LPTPPS	;END OF PAGE CLEAR OUT PAGE POS (ENTRY FOR FF)
	PUSHJ P,LPC
	JRST LPC1

LPC:	MOVE J,LINEPOS	;CR AND SPACE BACK OVER TO LINPOS
	MOVE B,A
	MOVEI A,15
	AOSN PCL
	SKIPE LINEPOS
	PUSHJ P,LPT.CR
	CLEARM LPTBSF	;IN CASE WAS ALREADY AT BEG OF LINE
	SOJL J,LPC2
	PUSHJ P,LPTS
	JRST .-2

LPC2:	MOVE A,B
	POPJ P,

EBLK

LPTCC:	<LPTBE-LPTBO>*5-5
LINEPOS:	0	;LINE POSITION # CHARS PRINTED THIS LINE BEFORE CURRENT
LPTPPS:	0	;PAGE POSITION (# LINES PRINTED BEFORE CURRENT)

PCL:	0	;INCREMENTED BY LF OR FF, SETOMED BY OHTER CONTROL CHARS
	;PROBABLY UNNECESSARY BUT NOT WORTH FLUSHING
LPTBSF:	0	;-1 => BACKSPACES HAVE BEEN TYPED, CR AND SPACE OVER BEFORE MAKING INK

LPTIP:	700,,LPTBO-1
LPTOP:	700,,LPTBO-1

BBLK

LPTCN:	CAIN A,<15-40>&177
	JRST LPTCR	;CRR
	CAIN A,<12-40>&177
	MOVEI A,400	;LINE FEED
	CAIN A,<14-40>&177
	MOVEI A,401	;FORM FEED
	CAIE A,177	;SKIP IF LOOKS LIKE A LEFT ARROW
	JRST LPTCN1	;GO TO PRINT
	HRRZ A,LPTOP	;LOAD OUPUT POINTER
	CAIE A,LPTBE-1	;SKIP IF CURRENT PNTR = END OF BUFFER
	JRST LPENT3	;REAL LEFT ARR
	MOVE A,[350700,,LPTBO]
	MOVEM A,LPTOP
	JRST LPENT2
]

IFN NLPTP,[
NLPT1:	SKIPGE C
	 SKIPA A,(C)
	  UMOVE A,(C)
	MOVE B,NLPTIP
	TLNN B,760000
	JRST NLPTW	;MAY NOT BE ROOM
NLPTW1:	IDPB A,NLPTIP
	MOVE T,NLPTIP
	CAMN T,NLPTEP
	SUBI T,LPTBSZ
	HRRM T,NLPTIP
	TLNE T,760000
	POPJ P,
	SOSGE NLPTBR
	JRST 4,.
NLPTGO:	CONO PI,LPTOFF
	CONSO NLPT,7
	CONO NLPT,100+LPTCHN	;SET OUTPUT DONE
	JRST LPTONJ

NLPTW:	SKIPG NLPTBR
	PUSHJ P,UFLS
	JRST NLPTW1

EBLK

NLPTIP:	010700,,NLPTBO-1
NLPTBO:	BLOCK LPTBSZ
NLPTEP:	010700,,NLPTBO+LPTBSZ-1
NLPTPP:	NLPTBO	;OUTPUT PNTR (PI)
NLPTBR:	LPTBSZ
NLPTBP:	004400,,NLPTBO-1	;BLKT POINTER
NLPTBC:	LPTBSZ	;BLKT CNT = MIN(# WDS TILL END OF BUF,NLPTBR)
NLPTOP:	NLPTBO	;VALUE OF NLPTBP BEFORE BLKT CALL
NLFREE:	-1	;-1 => LPT IN USE RECENTLY.
		;0 => NOT IN USE SINCE LAST VSCLK.
		;1 => NOT SINCE NEXT-TO-LAST VSCLK.
		;=>2 => LPT MOTOR NOW OFF.

BBLK

BNLPTO:	MOVE B,NLPTBP
	MOVEM B,NLPTOP
	PUSH P,[BNLPT1]
	MOVE E,[444400,,1]
	JSP B,BLKT
	SETZ NLPTBP
	NLPTBC
	BNLPTG
	BNLPT1
	@J
	SKIPG NLPTBR

BNLPT1:	MOVE T,NLPTBP
	MOVE W,T
	CAMN T,[004400,,NLPTBO+LPTBSZ-1]
	MOVE T,[004400,,NLPTBO-1]
	MOVEM T,NLPTBP
	EXCH T,NLPTOP
	SUB T,W	;- # WORDS WRITTEN
	ADDB T,NLPTBR	;DECREASE ROOM
	JUMPL T,[JRST 4,.]
	JRST NLPTGO

BNLPTG:	MOVE TT,NLPTBP
	MOVE J,NLPTBR
	MOVEI T,NLPTBO+LPTBSZ-1
	SUBI T,(TT)	;# WORDS UNTIL END OF BUFFER
	CAMLE J,T
	MOVE J,T
	MOVEM J,NLPTBC
	JRST POPJ1

NLPTCL:	SKIPLE NLPTBR	;ENOUGH ROOM?
	PUSHJ P,NLPTO3
	SETOM NLFREE
	SETOM NLUSR
	SETOM NLUSE
	POPJ P,

NLPDCL:	MOVSI H,760000
	SKIPA A,[177]
NLPDC1:	PUSHJ P,NLPTW1
	TDNE H,NLPTIP
	JRST NLPDC1
	HRRZ A,NLPTIP
	CAIN A,NLPTBO+LPTBSZ-1
	MOVEI A,NLPTBO-1
	HRLI A,004400
	MOVEM A,NLPTBP
	MOVNI A,(A)
	ADDI A,NLPTBO+LPTBSZ-1
	MOVE B,NLPTBR
	CAMLE A,B
	MOVE A,B
	MOVEM A,NLPTBC
	JRST NLPTCL
]

IFN NTYP\OLPTP\NLPTP\PLTP\340P\PDP6P\STKP\PTRP,[

EBLK
LPTA:	0
LPTB:	0
LPTACS:	BLOCK 15

LPTBRK:	0
BBLK
	MOVEM A,LPTA
IFN NTYP,[		;A KLUDGE FOR THE PDP 11 ON DM
	CONI NTY,A
	TRNE A,7	;NO PIA
	 TRNN A,200000	;NO FLAG
	  CAIA
	   JRST NTYBRK	;AHH, FLAG AND PIA
]
	
IFN OLPTP,[
	CONSZ OLPT,7
	CONSZ OLPT,10
	JRST .+2
	JRST LPENT1	;LINE PRINTER
]
IFN NLPTP,[
	CONSZ NLPT,7
	CONSO NLPT,100	;DONE
	JRST .+2
	JRST NLPENT	;NEW LINE PRINTER
]
IFN 340P,[
	CONI DIS,A
	TRNN A,77
	JRST LPTBR2
	CONSZ DIS,7400
	JUMPL A,SRECYC	;SPECIAL DISPLAY CHNL
]
LPTBR2:	MOVEM B,LPTB
IFN PLTP,[
	CONSZ PLT,SDS+PDS
	JRST PLTBRK	;PLOTTER
]
IFN PTRP,[
	CONSZ PTR,7
	CONSO PTR,10
	JRST .+2
	JRST PTRBRK
	CONSZ PTP,10
	JRST PBRK1	;PAPER TAPE PUNCH
]
IFN PDP6P,[
	CONSO DSDEV,7
	JRST .+3
	CONSZ DSDEV,10
	JRST DSDBRK	;INTERRUPT FROM OTHER PROCESSOR
]
IFN STKP,[
	CONSZ STK,7
	CONSO STK,10
	JRST .+2
	JRST STKINT	;STANFORD KEYBOARD
]
LPBKRT:	MOVE A,LPTA
	JRST 12,@LPTBRK

LPTRT1:	MOVS A,[C,,LPTACS]
	BLT A,17
LPTRT3:	MOVE B,LPTB
	MOVE A,LPTA
	JRST 12,@LPTBRK
]	  ;END IFN OLPTP\ ETC.
.ELSE [
EBLK
LPTBRK:	0
BBLK
	JRST 4,.
]

IFN OLPTP,[
LPENT3:	MOVEI A,177
	JRST LPTCN1

LPTCR:	CONO OLPT,10+LPTCHN	;PRINT LINE
	AOS LPTCC
	JRST LPBKRT

LPENT1:	MOVEI A,<LPTBE-LPTBO>*5-5
	CAMG A,LPTCC
	JRST LPTSTP
LPENT2:	ILDB A,LPTOP
	TRNE A,100
	JRST LPTCN
LPTCN1:	DATAO OLPT,A	;OUTPUT CHARACTER
	AOS A,LPTCC
	CONSZ OLPT,10
	JRST LPBKRT
	CAIGE A,<LPTBE-LPTBO>*5-5
	JRST LPENT2
LPTSTP:	CONO OLPT,0	;CLEAR PIA
	MOVEI A,SCRTPC
	SKIPGE LPTUSR
	 IORM A,SUPCOR	;LPT NOW IDLE
	JRST LPBKRT

EBLK

LPTBO:	BLOCK LPTBSZ-1
	-1
LPTBE:

BBLK

STALPT:	MOVE E,LINEPOS
	DPB E,[130700,,D]
	DPB A,[60300,,D]	;MODE
	MOVE E,LPTCC
	CAIG E,150.
	TRO D,1_9.
	CAIL E,30000
	TRO D,1_<9.+1>
	POPJ P,

LPTRS:	CONO PI,LPTOFF
	MOVEI A,5*<LPTBE-LPTBO>-5
	MOVEM A,LPTCC
	MOVE A,[700,,LPTBO-1]
	MOVEM A,LPTIP
	MOVEM A,LPTOP
	SETZM LINEPOS
	CONO PI,LPTON
	JRST LPTRS2

]

IFN NLPTP,[
NLPENT:	MOVE A,NLPTBR
	CAIN A,LPTBSZ
	JRST NLPTST
	CAIL A,LPTBSZ
	JRST 4,.
	DATAO NLPT,@NLPTPP
	AOS A,NLPTPP
	CAIN A,NLPTBO+LPTBSZ
	MOVEI A,NLPTBO
	MOVEM A,NLPTPP
	AOS NLPTBR
	JRST LPBKRT

NLPTST:	CONO NLPT,200	;CLEAR DONE AND PIA
	MOVEI A,SCRTPC
	SKIPGE NLUSR
	 IORM A,SUPCOR	;LPT NOW IDLE
	JRST LPBKRT

NLPTRS:	CONO PI,LPTOFF
	MOVE A,[010700,,NLPTBO-1]
	MOVEM A,NLPTIP
	MOVEI A,NLPTBO
	MOVEM A,NLPTPP
	MOVE A,[004400,,NLPTBO-1]
	MOVEM A,NLPTBP
	MOVEM A,NLPTOP
	MOVEI A,LPTBSZ
	MOVEM A,NLPTBR
	MOVEM A,NLPTBC
	CONO PI,LPTON
	JRST NLPTO3
]

SUBTTL	STANFORD KEYBOARD

IFN STKP,{
;3.4 => DON'T HANG ON IOT IF NO CHAR (RETURN -1 INSTEAD)
;3.5 = 1 => DON'T DO CHAR CONVERSION
;    = 0 => CONVERT ACCORDING TO OTHER BITS
;3.6 = 1 => ITS MODE (CTRL DOES CTRL AND META IS 8TH BIT)
;    = 0 => STANFORD MODE (400 = META, 200 = CTRL, AND ALL THE
;           CHARS FROM 1-177 CAN BE GENERATED WITH TOP AND SHIFT.)
;3.7 = 1 => IF 3.5 = 0, 3.6 = 1, THEN DON'T INPUT META BIT

STKO:	TLNE C,3	;BLOCK OR OUTPUT
	JRST OPNL12	;MODE NOT AVAILABLE
	CONO PI,CLKOFF
	SKIPL STKUSR
	JRST OPNL10	;DEVICE NOT AVAILABLE
	MOVEM U,STKUSR
	AOSE STKUSE
	JRST 4,.	;CAN ONLY BE OPEN ONCE
	CONO PI,CLKON
	HRRZ A,UUAC(U)
	MOVE A,CHNBIT(A)
	ROT D,-2
	DPB D,[220400,,A]
	MOVEM A,STKMSK
	MOVE A,STKBP
	MOVEM A,STKIP
	MOVEM A,STKOP
	SETZM STKBC
	DATAI STK,A	;CLEAR DONE
	CONO STK,LPTCHN
	MOVEI A,STKDP
	MOVEM A,(R)
	JRST POPJ1

STKCLS:	CONO STK,0	;CLEAR PIA
	SOSL STKUSE
	JRST 4,.	;CAN ONLY BE OPEN ONCE
	SETOM STKUSR
	POPJ P,

STKRS:	CONO PI,LPTOFF
	MOVE A,STKBP
	MOVEM A,STKIP
	MOVEM A,STKOP
	SETZM STKBC
	JRST LPTONJ

STKI:	MOVE TT,STKMSK
	TLNE TT,1
	 JRST STKI1
	PCLT
	SKIPG STKBC
	 PUSHJ P,UFLS
STKI2:	ILDB A,STKOP
	SOS STKBC
	TLNN TT,2
	 JRST STKCV	;DO CONVERSION
STKI3:	MOVE W,A
	MOVE A,STKOP
	CAMN A,STKEP
	SUBI A,STKBL
	HRRM A,STKOP
	POPJ P,

STKI1:	SKIPLE STKBC
	JRST STKI2
	JRST STTYI3

STKINT:	MOVEM B,LPTB
	DATAI STK,B
	ANDI B,1777	;CURRENTLY 10 BITS
	MOVE A,STKBC
	CAIL A,STKBS
	JRST LPTRT3	;NO ROOM.  JUST IGNORE CHAR
	IDPB B,STKIP
	AOS STKBC
	MOVE A,STKIP
	CAMN A,STKEP
	SUBI A,STKBL
	HRRM A,STKIP
	MOVE A,STKUSR
	HRRZ B,STKMSK
	AND B,MSKST2(A)
	IORM B,IFPIR(A)
	JRST LPTRT3

EBLK
STKBL==40
STKBS==STKBL*3
STKIP:	001400,,STKIB-1
STKIB:	BLOCK STKBL
STKEP:	001400,,STKIB+STKBL-1
STKBP:	001400,,STKIB-1
STKOP:	001400,,STKIB-1
STKBC:	0
STKMSK:	0	;BIT FOR CHANNEL STK OPEN ON
		;3.1 => DON'T HANG ON IOTS MODE
		;3.2 => DON'T CONVERT CHARS
		;3.3 => ITS MODE
		;3.4 => DON'T INPUT META IN ITS MODE
BBLK

STKCV:	LDB B,[000600,,A]	;LOW 6 BITS
	CAIN B,33
	JRST STKCV1	;33
	CAIL B,35
	CAILE B,47
	JRST .+2
	JRST STKCV2	;35-47
	CAIL B,74
	CAILE B,77
	JRST .+2
	JRST STKCV3	;74-77
	TRNE A,400
	JRST STKCVT	;TOP IS ON
	CAIG B,32
	JRST STKCV4	;0-32
	CAIN B,34	;SKIP IF 50-73
	JRST STKCVB	;34
STKCVX:	TLNN TT,4	;SKIP ON ITS MODE
	JRST STKCVY	;STANFORD MODE
	ANDI A,1000	;META BIT
	LSH A,-2
	TLNN TT,10	;SKIP ON DON'T INPUT META BIT
	IORI B,(A)
	MOVE A,B
	JRST STKI3

STKCVY:	LDB D,[110100,,A]	;META BIT
	LSH D,8		;IN 400 POSITION
	ANDI A,200	;CTRL BIT
	IORI A,(D)
	IORI A,(B)
	JRST STKI3

STKCV1:	MOVEI B,15
	JRST STKCVX

STKCV2:	MOVEI Q,-35(B)	;35-47 (-35)
	IDIVI Q,5
	LDB B,STKBPT(J)
	JRST STKCVX

STKCV3:	CAIE B,74
	JRST STKCV5	;75-77
	MOVEI B,177
	JRST STKCVX

STKCV5:	MOVEI B,33
	JRST STKCVX

STKCVT:	CAIG B,32	;TOP IS ON
	JRST STKCT1	;0-32
	CAIN B,34
	JRST STKCT2	;34
	MOVEI Q,-50(B)	;50-73 (-50)
	MOVE D,B
	IDIVI Q,5
	LDB B,STKBP1(J)
	TRNE A,200	;SKIP IF CTRL IS OFF
	TLNN TT,4	;SKIP IF ITS MODE
	JRST STKCVX
	CAIL D,52
	CAILE D,72
	TRZ B,100	;50,51,73
	JRST STKCVX

STKCT1:	MOVE Q,B	;0-32 TOP ON
	MOVE D,B
	IDIVI Q,5
	LDB B,STKBP2(J)
	TRNE A,200	;SKIP IF CTRL IS OFF
	TLNN TT,4	;SKIP IF ITS MODE
	JRST STKCVX
	CAIN D,12
	TRZ B,100
	JRST STKCVX

STKCT2:	MOVEI B,16
	JRST STKCVX

STKCV4:	TLNN TT,4	;SKIP IF ITS MODE
	JRST STKCV6
	TRNE A,200
	JRST STKCVX	;ITS, CTRL
STKCV6:	TRO B,100
	TRNN A,100
	TRO B,40	;SHIFT WAS OFF
	JRST STKCVX

STKCVB:	MOVEI B,134
	TRNE A,200	;SKIP IF CTRL IS OFF
	TLNN TT,4	;SKIP IF ITS MODE
	JRST STKCVX
	TRZ B,100
	JRST STKCVX

DEFINE	STKM A,B,C,D,E
	A_29.+B_22.+C_15.+D_8+E_1
TERMIN

DEFINE	STKM1 TBL
	350700,,TBL(Q)
	260700,,TBL(Q)
	170700,,TBL(Q)
	100700,,TBL(Q)
	010700,,TBL(Q)
TERMIN

STKBPT:	STKM1 STKTBL
STKTBL:	STKM 12,0,0,40,0
	STKM 33,0,0,11,14
	STKM 13,0,0,0,0

STKBP1:	STKM1 STKTB1
STKTB1:	STKM 133,135,26,174,41
	STKM 5,77,17,60,36
	STKM 22,23,20,21,44
	STKM 45,32,30,1,136

STKBP2:	STKM1 STKTB2
STKTB2:	STKM 0,34,7,6,74
	STKM 100,76,33,75,47
	STKM 137,31,27,25,24
	STKM 173,176,4,43,35
	STKM 46,140,10,37,3
	STKM 42,2,0,0,0
};IFN STKP

SUBTTL	INTERFACE (?) TO DM PDP11 ON NTY (REALLY WANT A CAIOS)
IFN NTYP,[
IFN TK10P,	.ERR	YOU REALLY WILL LOSE WITH BOTH TTY AND 11 ON NTY
NTYOPN:	PUSHJ P,NTYOP1	;SET UP OPEN
	 POPJ P,	;OPEN LOST?
	SKIPE NTYUSE	;IF THIS IS FIRST OPEN, DO SOME INITIALIZING
	 JRST POPJ1
	CONO NTY,0	;STOP INTS
	SETOM NTYOAC
	MOVE A,[NTYIOI,,NTYIOR]
	BLT A,NTYORM	;INITIALIZE ALL THE POINTERS AND COUNTERS
	CONO NTY,620000+NTYCHN
	JRST POPJ1

NTYOP1:	ROT D,1		;MODE BACK, TO GET INPUT & OUTPUT
	JSP Q,STDOPN
	 3,,NTYUSR
	 NTYIT,,NTYOT
	 0,,0		;NTYBIT,,NTYBOT

NTYRS==CPOPJ

NTYCLS:	SOSL NTYUSE	;-1 MEANS FREE (USE STDCLS?)
	 POPJ P,
	SETOM NTYUSE
	SETOM NTYUSR
	POPJ P,

;MAIN PROGRAM ROUTINES FOR IOT/SIOT ...

NTYBI==IOCR10
NTYBO==IOCR10

NTYTO::
NTYOPT:	PCLT			;PUT OUTPUT INTO BUFFER
	SKIPG C
	 SKIPA A,(C)
	  UMOVE A,(C)		;FETCH THE USERS BYTE
	SKIPG NTYORM		;WAIT FOR ROOM
	 PUSHJ P,UFLS
	IDPB A,NTYOIP
	SOSGE A,NTYORM
	 JRST 4,.		;WENT BELOW ZRO?
	AOSN NTYOAC
	 CONO NTY,10+NTYCHN	;NOT ACTIVE, START PI LEVEL
	AOSGE NTYOIR
	 POPJ P,
	MOVE A,[NTYOII,,NTYOIR]	;RING AROUND THE ROSY
	BLT A,NTYOIP
	POPJ P,
NTYTI::
NTYIGT:	MOVEI T,NTYIBS*4
	PCLT
	CAMG T,NTYIRM
	 PUSHJ P,UFLS		;WAIT UNTIL A BYTE COMES IN
	ILDB W,NTYIOP
	AOS NTYIRM		;NOW MORE ROOM
	AOSGE NTYIOR		;RING?
	 POPJ P,
	MOVE B,[NTYIOI,,NTYIOR]	;REDO POINTERS
	BLT B,NTYIOP
	POPJ P,

;INTERRUPT ROUTINES

NTYBRK:	TRC A,2000		;DEVICE #
	TRNE A,7000
	 JRST NTYSEL		;STOPPED ON OTHER DEVICE
	TRNE A,40
	 JRST NTYIPT		;INPUT
	TRNE A,20
	 JRST NTYOGT		;OUTPUT
NTYRET:	CONO NTY,620000+NTYCHN	;RESTART
	JRST LPBKRT

NTYSEL:	TRC A,2000		;HAVE TO KNOCK DOWN SOME OTHER FLAG
	ANDI A,7000
	LSH A,3
	CONO NTY,400000+NTYCHN(A)
	CONSZ NTY,40
	 DATAI NTY,A		;CLEAR INPUT
	CONSZ NTY,20
	 CONO NTY,20+NTYCHN	;CLEAR OUTPUT
	AOS NTYERR
	JRST NTYRET

NTYOGT:	MOVEI A,NTYOBS*4
	CAMG A,NTYORM
	 JRST  [SETOM NTYOAC
		CONO NTY,20+NTYCHN
		JRST NTYRET]
	ILDB A,NTYOOP
	AOS NTYORM
	DATAO NTY,A
	AOSGE NTYOOR
	 JRST NTYRET
	MOVE A,[NTYOOI,,NTYOOR]
	BLT A,NTYOOP		;ZAP THE POINTER AND COUNT (RING BUF)
	JRST NTYRET

NTYIPT:	SOSG NTYIRM
	 CONO NTY,100+NTYCHN	;IF HDWE NOT IN, BUFFER WILL BE CLOBBERED
				;BUT ALSO, THE COUNT WILL BE NEG!!!
	DATAI NTY,A
	IDPB A,NTYIIP
	AOSGE NTYIIR
	 JRST NTYRET
	MOVE A,[NTYIII,,NTYIIR]
	BLT A,NTYIIP		;RING THE BUFFER POINTERS
	JRST NTYRET

;DATA AREAS FOR THE NTY INTERFACE TO DM PDP 11

NTYIBS==1000
NTYOBS==100

NTYIOI:	-NTYIBS*4	;STUFF TO INITIALIZE INPUT SIDE
	041000,,NTYIBF-1
NTYIII:	-NTYIBS*4
	041000,,NTYIBF-1
	NTYIBS*4

NTYOOI:	-NTYOBS*4	;INITIALIZES OUTPUT SIDE
	041000,,NTYOBF-1
NTYOII:	-NTYOBS*4
	041000,,NTYOBF-1
	NTYOBS*4

EBLK

NTYIOR:	-NTYIBS*4	;RING COUNTER, INPUT BUFFER, OUTPUT PART
NTYIOP:	041000,,NTYIBF-1 ;BYTE POINTER, "   "
NTYIIR:	-NTYIBS*4	;RING CTR, INPUT BUFFER, INPUT PART
NTYIIP:	041000,,NTYIBF-1 ;BYTE POINTER, "   "
NTYIRM:	NTYIBS*4	;ROOM EMPTY IN IN BUFFER

NTYOOR:	-NTYOBS*4	;RING CTR, OUTPUT BUFF, OUT PART
NTYOOP:	041000,,NTYOBF-1 ; BYT PTR,  " "
NTYOIR:	-NTYOBS*4	;RING CTR, OUT BUFF, IN PART
NTYOIP:	041000,,NTYOBF-1 ;BYT PTR, "  "
NTYORM:	NTYOBS*4	;ROOM IN THE OUTPUT BUFFER

NTYIBF:	BLOCK NTYIBS	;INPUT BUFFER
NTYOBF:	BLOCK NTYOBS	;OUTPUT BUFFER

NTYOAC:	-1		;FLAG, OUTPUT ACTIVE UNLESS -1
NTYUSR:	-1
NTYUSE:	-1

NTYERR:	0

	BBLK
];NTYP

SUBTTL	PDP-10 TO PDP-11 INTERFACE AND XGP

IFN TEN11P,[
EBLK
T11MP:	BLOCK 256.	;CONTENTS OF TEN11 MAP, -1 => CONFLICT PAGE
BBLK
			;ELSE 0 => AVAIL
			;4.9=1 => CONTENTS OF MAP WD EXCEPT 4.7-4.3 => USE COUNT
IFN XGP,XGPTP==376	;PAGE NUMBER IN 10-11 RESERVED FOR CLK LEVEL XGP HACKS

;PLACE WD IN A IN AVAIL 10-11 MAP ENTRY (RETURN IN RH B)
T11AD:	SKIPE TEN11F
	POPJ P,
	MOVE C,A
	JSP Q,T11FND	;SKIP UNLESS NO MAP ENTRIES AVAIL
	JRST T11A1	;WD ALREADY IN PAGE
	MOVEI C,0	;FIND FREE PAGE
	JSP Q,T11FND
	JRST T11A2
	POPJ P,	;NO FREE PGS AVAIL

T11A1:	LDB E,[350500,,T11MP(B)]
	CAIN E,37
	JRST T11FN2	;USAGE COUNT MAX FOR THAT ENTRY
	AOS E
	DPB E,[350500,,T11MP(B)]
	JRST POPJ1


T11A2:	MOVEM A,T11MP(B)
	MOVEM A,400000+T11CP*2000(B)	;STORE IN HARDWARE
	JRST POPJ1

T11FND:	MOVSI B,-256.
T11FN1:
IFN XGP,[	CAMN B,[-256.+XGPTP,,XGPTP]	;DON'T ALLOCATE SPECIAL XGP ENTRY TO OTHER USERS
	JRST T11FN2
]
	MOVE E,T11MP(B)
	TLZ E,174000	;USE COUNT BITS
	CAMN E,C
	JRST (Q)	;FOUND IT
T11FN2:	AOBJN B,T11FN1
	JRST 1(Q)	;CANT FIND IT


;DELETE REF TO T11 PAGE IN B
T11DL:	SKIPE TEN11F
	POPJ P,
	MOVE E,T11MP(B)
	AOJE E,CPOPJ	;REALLY CONFLICT PAGE
	LDB E,[350500,,T11MP(B)]
	SOJL E,T11DL1	;DELETING LAST REF TO PAGE?
	DPB E,[350500,,T11MP(B)]
	POPJ P,

T11DL1:	CLEARM T11MP(B)
	CLEARM 400000+T11CP*2000(B)
	POPJ P,
]

IFN TEN11P,[

;.CALL ADR
;	LOSE
;	WIN
;ADR/	SETZ
;	SIXBIT /T11MP/
;	ARG 1 VIRT PAGE #
;	ARG 2 DESIRED T11 MAP WORD

NT11M:	TDNE A,[-400]	;TEMP? TEN11 CALL A HAS USER PG
	 JRST OPNL33	;INVALID ARG - BAD USER PAGE #.
	SKIPE TEN11F
	 JRST OPNL7	;DEVICE NOT READY.
	PUSHJ P,UPLC
	MOVE W,A
	JUMPGE B,OPNL33
	TLZ B,174000	;DONT ALLOW ANYTHING IN USAGE COUNT BITS
	MOVE D,B
	LDB E,Q
	JUMPE E,NT11M1	;PAGE MUST BE FREE OR ABS, OTHERWISE ERROR
	CAIE E,-1
	 JRST OPNL13	;FILE ALREADY EXISTS
	LDB B,T
	ANDI B,PMRCM
	LDB E,[.BP <PMRCM-377> B]	;GET MOBY #
	ANDI B,377
	CAIN E,T11CPA_-18.
	PUSHJ P,T11DL
	MOVEI B,0
	DPB B,Q
	DPB B,T
NT11M1:	MOVE R,Q
	MOVE A,D
	PUSHJ P,T11AD
	 JRST OPNL37	;NO CORE AVAILABLE.
	ADDI B,200000+<<T11CPA_-18.>_8>	;ADDRESS CORRECT MOBY
	TLNE A,200000
	TRO B,400000	;WRITE PERMISSION
	DPB B,T
	MOVEI C,-1
	DPB C,R
	LSH W,10.
	ADDI W,2000
	CAMLE W,HUSRAD(U)
	MOVEM W,HUSRAD(U)
	JRST POPJ1
]
.ELSE NT11M:	JRST OPNL1	;NO SUCH DEVICE.
IFN XGP,[
;CLOCK LEVEL XGP CODE FOR FILLING IMAGE MODE BUFFERS
;ASSUMES XGP11P IS POINTER TO FIRST 11 RING NODE
;AND THAT THE 11 BUFFER RING STRUCTURE IS:

;	POINTER TO NEXT NODE OF BUFFER
;	USE WORD	(0=> EMPTY)
;	POINTER TO BUFFER (ASSUMED TO BE 1K 10 STYLE, 2K 11 STYLE)

;
;THE NODES AND THE BUFFERS MUST BEGIN ON EVEN PDP-11 WORDS
;I.E. 11 ADDRESSES ENDING WITH TWO ZEROES.

;THIS CODE USES A SPECIAL 10-11 INTERFACE ENTRY
;NAMELY, XGPTP, AND THREE EXEC PAGES, XGPC WHICH POINTS TO
;THE LOW 2K OF PDP-11 CORE, USED FOR THE RING NODE POINTERS
;XGPUB WHICH POINTS TO THE CURRENTLY HACKED USER PAGE
;AND XGPB WHICH POINTS PERMANENTLY TO THE 10-11 PAGE CORRESPONDING
;TO XGPTP

XGP11==1	;PDP-11 RUNNING XGP
XGPCA==XGPC*2000+400000	;EXEC ADR OF LOW PDP-11 CORE
XGPBA==XGPB*2000+400000	;EXEC ADR OF BUFFER IN PDP-11
XGPUBA==XGPUB*2000+400000	;EXEC ADR OF CURRENT PAGE IN USER'S MAP
XGNTPG==117.	;MAX # TIED DOWN PAGES (WOULD YOU BELIEVE...)
X11BFP==102	;LOC OF XGP BUFF HEAD IN 11 (PDP11 ADR 410)

XGPCLK:	PUSH P,A
	PUSH P,B
	MOVE A,XGPTM1	;TIME FIRST PAGE LOCKED IN CORE
	ADDI A,30.*60.	;1 MINUTE
	CAMGE A,TIME	;WIN?
	JSP Q,XGPFLS	;LOSE...
	SKIPL XGPINI	;DON'T HACK UNTIL MAIN PGM HAS PAGES TIED DOWN
	JRST POPBAJ
	SPM XGPSPM	;SAVE OLD MAP
XGPC1:	MOVE A,XGP11P	;GET POINTER TO FIRST PDP-11 BUFFER
	MOVE A,XGPCA(A)	;GET CONTENTS FROM PDP-11
	LDB B,[242000,,A]	;GET NEXT RING POINTER
	LDB A,[042000,,A]	;GET USE WORD
	JUMPN A,POPBAJ	;BUFFERS FULL
	TRNE B,3
	JSP Q,XGPFLS	;NEW BUF POINTER NOT ON EVEN WD BNDY
	LSH B,-2	;CONVERT TO 10 ADDRESS
	SKIPE B
	CAIL B,2000	;IS IT WITHIN CONTROL PAGE?
	JSP Q,XGPFLS	;FLUSH
	EXCH B,XGP11P	;SETUP NEXT POINTER, GET BACK OLD ONE
	MOVEM B,XGPOB	;SAVE OLD POINTER FOR HACKING BUFF FULL
	MOVE B,XGPCA+1(B)	;GET POINTER TO 11 BUFFER
	LDB B,[242000,,B]
	TRNE B,3
	JSP Q,XGPFLS
	LSH B,8		;SETUP 10-11 ENTRY
	IOR B,[600000+<XGP11_8>,,1777]	;R/W, PROT INFINITE
	MOVEM B,400000+2000*T11CP+XGPTP	;GRONK INTO 10-11 INTERFACE
	MOVEM B,T11MP+XGPTP	;FOR DEBUGGING ONLY
	ILDB A,XGP10P	;GET POINTER TO NEXT 10 PAGE
	CAIL A,TSYSM	;LOSE
	JRST 4,.	;MAIN PGM HAS POINTER TO NXM
	JUMPE A,XGPFIN	;HERE WE ARE DONE, I HOPE.  DEUS GRATIUS
	MOVE B,A	;SAVE MMSWP ENTRY # TO CLEAR OUT TIE DOWN
	IORI A,600000	;R/W
	DPB A,[.XGPUB+EXEUMP]	;GRONK EXEC MAP
	LPMR XGPSPM	;RESET ASSOC REGS
	MOVE A,[XGPUBA,,XGPBA]
	BLT A,XGPBA+1777	;DO THE STUFF!
	MOVSI A,-1
	ADDM A,MMSWP(B)	;CLEAR TIE DOWN, PHEW!
	SKIPGE MMSWP(B)	;STOP BUGGY LOSSAGE
	JRST 4,.
	PUSHJ P,XGPBIT	;GET TABLE INFO
	TDNN A,XGPMTB(B)
	JRST 4,.	;UNTIED PAGE NOT TIED DOWN
	ANDCAM A,XGPMTB(B)	;CLEAR THE BIT
	MOVEI A,0
	DPB A,[.XGPUB+EXEUMP]	;CLEAR EXEC PAGE MAP
	MOVE A,XGPOB	;GET OLD RING PTR
	MOVEI B,30	;CHANGE RH ONLY TO A 1
	MOVEM B,XGPCA(A)	;SET BUFFER FULL
	JRST XGPC1	;LOOP TO GET A NEW BUFFER



XGPFIN:	SETZM XGPINI
	JSP Q,XGPFLS

;MMSWP ENTRY IN B,
;RETURNS BIT IN A
;WD OF TABLE IN B
XGPBIT:	MOVE A,B
	IDIVI A,36.
	MOVNS B
	PUSH P,A
	MOVSI A,400000
	LSH A,(B)
	JRST POPBJ

;CALLED FROM CORE ALLOCATOR WHEN FLUSHING PAGES
;OF A JOB WHICH HAVE LH OF MMSWP NON ZERO.

XGPCFL:	CAME U,XGPUSR	;ARE WE CONCERNED?
	POPJ P,	;NOPE
	PUSH P,A
	PUSH P,B
	MOVE B,TT	;B GETS MMSWP INDEX
	PUSHJ P,XGPBIT	;GET INDEXES INTO XGPMTB
	TRNN A,XGPMTB(B)	;IS THIS A PAGE BEING HACKED BY XGP?
	JRST POPBAJ	;NOPE
			;FALLS THRU

;XGPFLS IS CALLED AT THE CLOCK LEVEL IF ANYTHING GOES WRONG WITH ANYTING
;AND AT THE END OF THE RUN.
;IT FREES THE WORLD, AND FLUSHES THE XGP USER

XGPFLS:	MOVEM Q,XFLSPC
	SETOM XGPUSR	;FLUSHES XGP, ALSO PREVENTS TIMING ERRORS IF XGPFLS CALLED
			;AT CLOCK LEVEL, SINCE IT WON'T BE ANY MORE
	PUSH P,C
	PUSH P,D
	CLEARB A,B
	MOVSI C,400000
	MOVSI D,-1
XGPFL1:	TDNN C,XGPMTB(B)
	JRST XGPFL3	;THIS PAGE NOT HACKED
	ADDM D,MMSWP(A)	;UNTIE THIS PAGE
	SKIPGE MMSWP(A)
	JRST 4,.
	ANDCAM C,XGPMTB(B)	;AND FLUSH THIS BIT
XGPFL3:	ROT C,-1	;MOVE ON TO NEXT BIT
	SKIPGE C	;BEG OF NEW WORD?
	AOS B	;YES, AOS XGPMTB INDEX
	CAIGE A,TSYSM-1	;FINISHED WITH ALL OF MMSWP ENTRIES?
XGPFL2:	AOJA A,XGPFL1	;NOPE, LOOP BACK FOR MORE FUN
	POP P,D
	POP P,C
	JRST POPBAJ


;MAIN PROGRAM BUFFER TIE DOWN ROUTINES
;.CALL FOO
;FOO:	SETZ
;	SIXBIT /XGPIM/
;	SETZ POINTER TO [# OF PAGES,,FIRST PAGE]

NXGPIM:	XCTR XRW,[MOVES B,(A)]	;GET POINTER, AND CHECK FOR WRITE
	JUMPL B,XCONT	;CONTINUING A PREVIOUS CALL
	SKIPN TEN11F
	SKIPL XGPUSR
	POPJ P,		;LOSE
	MOVEI C,X11BFP	;BUFF HEAD IN 11 DEFINED AS 1000
	MOVEM C,XGP11P
	MOVE C,XGPCA(C)	;GET BUFF POINTER FROM 11
	JUMPE C,CPOPJ	;LOSE, THE 10-11 IS LOSING OR PGM LOSING
	MOVE C,TIME
	MOVEM C,XGPTM1	;SET UP TIMEOUT ON PAGE LOCK
	SETZM XGPINI	;SAY NOT ACTIVE
	MOVEM U,XGPUSR	;AND BEING LOADED
	SETZM XGPTAB
	MOVE C,[XGPTAB,,XGPTAB+1]
	BLT C,XGPTAB+LXTAB-1	;CLEAR OUT OLD PAGE BUF TABLE
	MOVE C,[441400,,XGPTAB]
	MOVEM C,XGP10P	;SETUP BYTE POINTER TO PAGE LIST
XTIE:	TLO B,400000
	UMOVEM B,(A)
	HRRZ C,B
	HRRZ E,B	;C,E GET PAGE # NEXT TO BE TIED DOWN
	HLRZ D,B	;D GETS COUNT OF PAGES LEFT
	LSH C,10.
	UMOVE B,20(C)	;BRING IN THAT LOSING PAGE
	PUSHJ P,SWTL
	CIRPSW
	TRZ D,400000
	CAIL D,XGNTPG	;MAX # PAGES TIED DOWN
	JRST XLOSE
	EXCH E,A
	CAIL A,400
	JRST XLOSE	;PAGE OUT OF REASONABLE RANGE
	PUSH P,A
	PUSHJ P,UPLC	;FIND OUT PAGE MAP ENTRY
	LDB B,Q
	CAIN B,-1
	JRST XLOSE1
	LDB B,T
	ANDI B,PMRCM
	CAIL B,TSYSM
	JRST 4,.
	PUSHJ P,XGPBIT
	CONO PI,CLKOFF	;CLOCK OFF TO PREVENT PAGES 1/2 TIED DOWN
	TDNN A,XGPMTB(B)	;WE HAVE HIT THIS PAGE ALREADY
	CAME U,XGPUSR	;TIMEOUT OR OTHER GROSS LOSSAGE
	JRST XLOSE1	;DON'T TIE THIS ONE DOWN, AND FLUSH ALL THE REST
	IORM A,XGPMTB(B)	;SET BIT IN XGP MEM TABLE
	LDB B,T
	ANDI B,PMRCM
	IDPB B,XGP10P	;PUT IN BUFFER LIST
	MOVSI A,1
	ADDM A,MMSWP(B)	;TIE IT DOWN GOOD (FOR ALL YOU BONDAGE FREAKS)
	CONO PI,CLKON
	PUSHJ P,LSWPOP	;CIRPSW
	POP P,B
	SOJLE D,XBFIN	;WE ARE DONE TYING START XGPING
	AOS B
	HRL B,D
	MOVE A,E	;NOW, LOOP FOR MORE CRUFTIES, OR
XCONT:	CAME U,XGPUSR	;REENTER HERE IF THE MAD SWAPPER HAD US SWAPPED OUT
	POPJ P,
	JRST XTIE

XLOSE1:	CONO PI,CLKON	;CLEANUP AFTER LOSSAGE
	SUB P,[1,,1]
XLOSE:	PUSHJ P,LSWPOP	;CIRPSW
	PUSH P,A
	PUSH P,B
	JSP Q,XGPFLS	;FLUSH THE LAST VESTIGE OF THIS ABORTIVE ATTEMPT TO CAUSE WINNAGE

XBFIN:	SETOM XGPINI	;THE WORST IS OVER, SIT BACK AND RELAX
	MOVE A,[441400,,XGPTAB]
	MOVEM A,XGP10P
	JRST POPJ1	;TELL HIM HE MAY EVEN WIN SOMEDAY

XPLO:	CONO PI,CLKOFF
	PUSHJ P,XPLST
	JRST XPLO1
	CONO PI,CLKOFF
	PUSHJ P,XPLWT
	PUSHJ P,UFLS
	MOVE T,XPLU
	SKIPE IOCHNM(T)
	JRST XPLO2
	MOVE T,SV40(T)
	CAME T,[.SLEEP 17,]
XPLO2:	JRST OPNL10
	CONO PI,CLKON
	MOVNI A,1
	MOVSI B,(SIXBIT /XPL/)
	PUSHJ P,CLIO
	POPJ P,
	MOVE A,UTMPTR(U)
	MOVE B,XPLU
	MOVEM A,UTMPTR(B)
	JRST POPJ1

XPLO1:	PUSHJ P,UDELAY
	JRST XPLO

XPLST:	SKIPL T,XPLU
	PUSHJ P,XPLIN
	JRST POPJ1
	HRROI A,XPL
	CONO PI,UTCOFF
	PUSHJ P,NUJBST
	JRST UTCONJ
	JRST UTCOJ1

XPLWT:	SKIPGE T,XPLU
	POPJ P,
	PUSHJ P,XPLIN
	SKIPGE IOCHNM(T)
	JRST POPJ1
	MOVS Q,SV40(T)
	CAIN Q,(.SLEEP 17,)
	AOS (P)
	POPJ P,

XPLIN:	PUSH P,U
	CAML T,USRHI
	JRST XPLIN1
	HLRE U,UNAME(T)
	AOJN U,XPLIN1
	MOVSI U,(SIXBIT /XPL/)
	CAME U,JNAME(T)
XPLIN1:	AOS -1(P)
	POP P,U
	POPJ P,

;VARIABLES AREA
EBLK

XGPTAB:	BLOCK XGNTPG/3+1	;PAGE #'S OF XGP BUFS IN 12 BIT BYTES
LXTAB==.-XGPTAB
XGP11P:	0	;POINTER TO 11 RING STRUCTURE (10 STYLE ADR INTO XGPC)
XGPOB:	0	;TEMP FOR OLD XGP11P
XGP10P:	0	;BYTE POINTER INTO XGPTAB FOR GETTING 10 BUFFERS
XGPMTB:	BLOCK TSYSM/36.+1	;BIT TABLE FOR KEEPING
				;TRACK OF AOSES OF MMSWP
XGPUSR:	-1	;XGP USER INDEX, -1 IF NONE
XGPINI:	0	;IF -1, SIGNAL TO CLK CODE THAT ALL BUFFERS ARE NOW TIED  DOWN.
XFLSPC:	0	;PC OF LAST CALL TO XGPFLS
XGPSPM:	BLOCK 8	;STORAGE FOR PAGE MAP ENTRIES
XGPTM1:	0	;TIME FIRST PAGE TIED DOWN
XPL:	SIXBIT /XPL/	;FILE + JNAME OF XPL INTERPRETER
XPLU:	0	;INDEX OF LOADED XPL

BBLK
]

IFE XGP,NXGPIM:	JRST OPNL1	;NO SUCH DEVICE

SUBTTL	ROBOT ARM ROUTINES

IFN ARMP,[
NARMCH==11.

AARMOVE:	UMOVE A,(J)
	JUMPGE A,CPOPJ
	CAMGE A,[-100,,]
	JRST ILUUO
	CONO PI,CLKOFF
	CAMN U,ARMUSR
	JRST AARM1A
	SKIPL ARMUSR
	JRST ILUUO
;	CONO TIPDEV,0
;	CONI TIPDEV,C
;	JUMPE C,ILUUO	;DONT ALLOW ARM TO RUN WITHOUT TIPBRK
;	DATAI TIPDEV,C
;	TRNN C,1
;	JRST ILUUO	;WRIST DETENT OFF NORMAL- BARF
;	CONO TIPDEV,TIPBCH
	MOVEM U,ARMUSR
AARM1A:	CONO PI,CLKON
	MOVSI B,-NARMCH
AARM1:	SETZM ARMDF(B)
	SKIPN ARMF
	SETOM DESTIN(B)	;NOT PREV IN USE, INITIALIZE
	AOBJN B,AARM1
	SKIPN ARMF
	SETOM OMPXIF
	SKIPN ARMF
	PUSHJ P,IMXON	;START IMX
	SETOM ARMF	;ARM NOW IN USE
	SETOM DLSRCH
ARML:	UMOVE E,(A)	;PICK UP COMM
	LDB C,[220400,,E]
	JUMPE C,ARML1	;NO INDEX
	XCTR XRW,[HRRZ Q,(C)]
	ADD E,Q
	TLZ E,17
ARML1:	TLZE E,20
	XCTR XRW,[HRR E,(E)]
	LDB D,[360600,,E]	;CHNL
	LDB C,[300600,,E]	;OP
	CAIGE D,NARMCH
	CAIL C,NARMOP
	JRST ARMLOS
	PUSHJ P,@ARMOPT(C)
	AOBJN A,ARML
ADF1:	MOVSI D,-NARMCH
ADFL:	SKIPL A,ARMDF(D)
	JRST ADF2
	TLNE A,100000
	JRST .+3
	MOVE C,RMAXV(D)
	MOVEM C,MAXV(D)
ADF2:	AOBJN D,ADFL
	SETZM DLSRCH
	JUMPL B,POPJ1
	POPJ P,

ARMLOS:	SETZM DLSRCH
	JRST ILUUO

ARMOPT:	ASDEST	;0 SET DEST
	ASVEL	;1 SET VELOC
	ATDEST	;2 COMPARE COMPUTED POSN
	ATVEL	;3 COMPARE COMPUTED VELOC
	AADST	;4 COMPARE ACTUAL POS
	ARPOST	;5 READ CURRENT POSITION
NARMOP==.-ARMOPT

ARPOST:	LDB B,IMPXPP(D)	;READ POSITION
	UMOVEM B,(E)
	POPJ P,

ASDEST:	ANDI E,7777
	CAMGE E,DESMIN(D)
	MOVE E,DESMIN(D)
	CAMLE E,DESMAX(D)
	MOVE E,DESMAX(D)
	MOVEM E,DESTIN(D)
	MOVSI E,600000
ADFSET:	IORM E,ARMDF(D)
	POPJ P,

ASVEL:	ANDI E,7777
	CAMLE E,RMAXV(D)
	MOVE E,RMAXV(D)
	MOVEM E,MAXV(D)
	MOVSI E,500000
	JRST ADFSET

AADST:	LDB C,IMPXPP(D)	;COMPARE ACTUAL POSITION
	SUB C,DESTIN(D)
	JRST ATD1

ATDEST:	SKIPA C,DESTIN(D)	;COMPARE COMPUTED POSITION
ATVEL:	SKIPA C,VELOC(D)	;COMPARE COMPUTED VELOCITY
	SUB C,POST(D)
ATD1:	MOVMS C
	CAMLE C,E
	TLO B,400000
	POPJ P,

SERVO:	MOVSI A,-NARMCH
	AOSN OMPXIF
	JRST SERVI
SERV1:	MOVE T,DESTIN(A)
	SUB T,POST(A)
	SKIPN VELOC(A)
	JUMPE T,SERVX
SERV1A:	MOVN B,MAXV(A)
	MOVE C,VELOC(A)
	SUB C,MAXA(A)
	CAMGE C,B
	MOVE C,B
	MOVE B,VELOC(A)
	ADD B,MAXA(A)
	CAMLE B,MAXV(A)
	MOVE B,MAXV(A)
	CAMG T,B
	CAMGE T,C
	JRST SERV2
	MOVM D,T
	CAMLE D,MAXA(A)
	JRST SERV2
SERV3:	MOVEM T,VELOC(A)
	ADDB T,POST(A)
	IOR T,OMPXP(A)
	DATAO OMPX,T
SERVX:	AOBJN A,SERV1
SERVR:	JRST ARMSVR

SERV2:	SKIPGE T
	SKIPA D,C
	MOVE D,B
	SUB T,VELOC(A)
	MOVM E,D
	IMUL D,E
	IDIV D,MAXA(A)
	ASH D,-1
	CAMGE D,T
	SKIPA E,B
	MOVE E,C
	MOVE C,E
	XOR C,VELOC(A)
	JUMPGE C,SERV2A
	MOVE C,E
	XOR C,T
	JUMPGE C,SERV2A
	SKIPA T,VELOC(A)
SERV2A:	MOVE T,E
	JRST SERV3

SERVI:	LDB B,IMPXPP(A)	;INITIALIZE TO CURRENT ARM STATE
	MOVEM B,POST(A)
	SETZM VELOC(A)
	SKIPGE DESTIN(A)
	MOVEM B,DESTIN(A)
	IOR B,OMPXP(A)
	DATAO OMPX,B
	AOBJN A,SERVI
	JRST SERVR

AARMOFF:	CAME U,ARMUSR
	POPJ P,
	CONO TIPDEV,0
	SETZM ARMF
	PUSHJ P,IMXCL1
	SETOM ARMUSR
	POPJ P,

AARMRS:	CAME U,ARMUSR	;RESET ARM LOCK FLAGS
	POPJ P,
	MOVSI A,-NARMCH
AARMR1:	SKIPL ARMLOK(A)
	JRST AARMR2
	CONO PI,OMXOFF
	SETOM DESTIN(A)	;RELOAD ARM COMM FROM CURRENT POS
	CLEARM ARMLOK(A)
	SETOM OMPXIF
	CONO PI,OMXON
AARMR2:	AOBJN A,AARMR1
	POPJ P,


TIPBRK:	DATAI TIPDEV,B
	TRNE B,1	;WRIST DETENT
	JRST TIPBR2
	SETOM ARMLOK+ARMVRT	;UNHAPPINESS
TIPBR2:	EXCH B,TIPBR
	XOR B,TIPBR
	SKIPGE A,ARMUSR
	JRST TIPBR1
	ANDI B,7
	LSH B,ATPSFT
	IORM B,PIRQC(A)
TIPBR1:	JRST OMXRET


EBLK

;JOINT ASSIGN
;0-10 AMF SWING VERT HORIZ YAW TILT GRIP ROTATE EXTEND ROLL
;11-12 NEW VIDI FOCUS IRIS

ARMVRT==1	;CHNL # OF ARM VERT

DESMIN:	IRPS A,,0 41 233 0 0 0 0 0 0 0 0
	A
TERMIN
DESMAX:	IRPS A,,7777 7777 7323 7777 7777 7777 7777 7777 7777 7777 7777
	A
TERMIN
DESTIN:	BLOCK NARMCH	;-1 NOT COMMANDED   + VAL OF POSITION COMMAND
POST:	BLOCK NARMCH	;POSITION OF ARM AT PI LEVEL
VELOC:	BLOCK NARMCH
MAXV:	BLOCK NARMCH
ARMDF:	BLOCK NARMCH	;4.9 VARIABLE CHANGED 4.5 POS VAR 4.7 VEL 4.6 ACC
ARMLOK:	BLOCK NARMCH	;IF -1 AXIS LOCKED DO NOT ALLOW CHNG IN COMMAND

MAXA:	REPEAT NARMCH,14
RMAXV:	REPEAT NARMCH,140

OMPXP:	IRPS A,,2 3 4 6 7 12 11 10 5 32 31
	A,,
	TERMIN

IMPXPP:	IRPS A,,102 103 104 106 107 112 111 110 105 132 131
	301400-140000*<A-A/3*3>,,MPXBUF+A/3
	TERMIN

ARMUSR:	-1	;-1 OR INDEX OF USER DOING ARMOVE
OMPXIF:	0	;-1 => INITIALIZE DESTINS'S TO CURRENT ARM POSITION
ARMF:	0	;-1 ARM IN USE, 0 NO ARMOV EXECUTED
TIPBR:	0	;TIP BREAK REG LAST TIME READ IN
BBLK
]

SUBTTL	INPUT MULTIPLEXOR

IFN IMXP,[
APOTSE:	CONI MPX,T
	JUMPE T,ILUUO	;MPX NOT AVAIL
	MOVE C,B
APOTS1:	UMOVE A,(C)
	ANDI A,377	;GET IMPX CHNL
	JUMPE A,CPOPJ		;CHNL 0 = END OF LIST
	IDIVI A,3		;COMPUTE MPXBUF INDEX
	ADD A,MPXPT(B)		;FORM BYTE PTR
	MOVSI B,-NPOTCH		;SET UP TN DELETE PREVIOUS POT CONN
PTS1:	CAMN A,POTBPT(B)	;IS ENTRY FOR SAME CHNL
	SKIPG POTUSR(B)	;AND ACTIVE
	JRST PTS2		;NO,KEEP LOOKING
	CAME U,POTUSR(B)	;IS THIS USER THE ONE WHO MADE ENTRY
	JRST ILUUO		;NO,ILLEGAL
	PUSHJ P,NARK		;DEACTIVATE AND FREE ENTRY

PTS2:	AOBJN B,PTS1		;TRY NEXT ENTRY
	MOVEI B,400000		;MASK FOR DELETE ONLY
	XCTR XRW,[TDNE B,(C)]		;SKIP ON NEW ENTRY WANTED
	JRST PTSR		;TRY FOR NEXT BLOCK
	MOVSI B,-NPOTCH		;SET UP TO FIND FREE ENTRY
PTS3:	SKIPL POTUSR(B)		;SKIP ON FREE
PTS4:	AOBJN B,PTS3		;TRY OTHER SLOTS
	JUMPGE B,ILUUO		;NO SLOTS AVAIL
	CONO PI,CLKOFF		;PREVENT OTHER GRABBERS
	SKIPGE POTUSR(B)	;SKIP IF JUST TAKEN
	JRST PTS5		;OKAY FOR SURE
	CONO PI,CLKON		;REENABLE
	JRST PTS4		;TRY ANOTHER

PTS5:	SETZM POTUSR(B)		;MARK TAKEN
	AOS IMXNTO
	AOS POTCON		;INCREMENT NUMBER SLOTS IN USE
	PUSHJ P,IMXON		;START IMPX
	CONO PI,CLKON		;AND ENABLE
PTS6:	MOVEM A,POTBPT(B)	;SAVE PTR TO MPXBUF FOR MPX ROUTINE
	XCTR XRW,[HRRZ A,1(C)]		;GET USER ADR
	XCTRI XRW,[MOVES (A)]
	 JRST .+2
	  JRST PTSL1		;NO,LOSE
	XCTR XRW,[HLL A,1(C)]		;GET BYTE FIELDS
	TLNN A,777700		;IF NONE SPECIFIED
	TLC A,4400		;ASSUME FULL WORD
	TLZ A,77		;FLUSH INDEX,INDIRECT
	MOVEM A,POTVPT(B)	;SAVE AS USER MEM PTR FOR MPX ROUTINE
PTS7:	UMOVE A,(C)
	ANDI A,3	;GET FLOAT + ABS BITS
	MOVEI D,PUFLI		;ADDR OF FLOATING INCREMENTAL UPDATE
	TRNN A,1		;SKIP ON FLOATING
	MOVEI D,PUFXI		;ADDR OF FIXED INCREMENTAL UPDATE
	TRNE A,2		;SKIP ON NOT ABSOLUTE
	SOS D			;ABS ROUTINE STARTS ONE BEFORE INCREMENTAL
	MOVEM D,POTUPD(B)	;SAVE ROUTINE ADDR FOR MPX ROUTINE
PTS8:	XCTR XRW,[MOVN D,2(C)]		;GET LOWER LIMIT
	MOVNM D,POTOFS(B)	;SAVE AS OFFSET FOR MPX ROUTINE
	TRNE A,1		;SKIP ON FIXED
	JRST PTS9		;GO SET FLOATING PARAMS
	XCTR XRW,[ADD D,3(C)]		;UL-LL
	ASH D,-2		;SCALE MULTIPLIER

PTS9R:	MOVEM D,POTSCL(B)	;STORE SCALE FACTOR FOR MPX ROUTINE
	LDB D,POTVPT(B)		;GET CURRENT VARIABLE VALUE
	TRNE A,1		;SKIP ON FIXED
	JRST PTS10		;COMPUTE FLOATING INCR VALUE
	SUB D,POTOFS(B)		;D_VAL-LL FIXED
	MOVSI E,200000		;SET TO ROUND VALUE
	ASHC D,-25.		;SCALE TO GET 12 BIT VALUE
	DIV D,POTSCL(B)		;COMPUTE INCR VAL FOR VAR
PTS10R:	HRROM D,POTVAL(B)	;STORE INCR VALUE FOR MPX ROUTINE
	MOVEM U,POTUSR(B)	;STORE USER TO ACTIVATE MPX ROUTINE
PTSR:	ADDI C,4		;ADVANCE POINTER TO NEXT 4 WORD BLOCK
	JRST APOTS1		;GO SET MORE TABLE ENTRIES

PTS9:	FADR D,3(C)		;UL-LL IN FLOATING
	FSC D,-12.		;SCALE DOWN FOR POT RANGE
	JRST PTS9R		;RETURN WITH SCALE FACTOR

PTS10:	FSBR D,POTOFS(B)	;D_VAL-LL FLOATING
	FDVR D,POTSCL(B)	;COMPUTE INCR VAL FLOATING
	MULI D,400		;FIX INCR VAL
	TSC D,D			;WORK FOR BELOW LOWER LIMIT
	ASH E,-243(D)		;VALUE IN E
	MOVE D,E		;TO D LIKE FIXED
	JRST PTS10R		;RETURN WITH INCR VALUE


PTSL1:	PUSHJ P,NARK
	PUSHJ P,TPFLT
	JRST UUOTRO

;POTS UPDATE CALLED BY MPX ROUTINE

UPOTS:	SPM UPTPGT
	MOVSI A,-NPOTCH		;SET UP TO LOOP FOR ALL POT TABLE POSITIONS
	SETZM UPUSR		;INDICATE NO USER SET UP
UPOT1:	SKIPLE U,POTUSR(A)	;SKIP ON SLOT UNUSED OR IN PROCESS
	JRST UPOT2		;GO TRY TO UPDATE VAR
UPOTR:	AOBJN A,UPOT1		;TRY NEXT POT TABLE ENTRY
	LPMR UPTPGT	;RESTORE MAP
	JRST UPOTRT		;DONE

UPOT2:	CAMN U,UPUSR		;IS THIS USER LAST UPDATED
	JRST UPOT3		;YES, RELOCATION IS SETUP
	MOVE T,USTP(U)		;TEST TO SEE IF
	SKIPN UMAPS(U)	;MAP LOADED TO POINT TO OTHER USER
	TLNE T,BUCSTP+BCSTOP	;USER BEING MOVED
	JRST UPOTR		;YES DON'T UPDATE FOR HIM
	MOVEM U,UPUSR		;SAVE AS LAST USER SET UP
	LPMR UPGML(U)	;LOAD USERS MAP
UPOT3:	LDB B,POTBPT(A)		;GET CURRENT ABS POSITION
	HLRZ C,POTVAL(A)	;GET POS LAST TIME
	TRNE C,400000		;SKIP UNLESS FIRST TIME
	JRST UPOT3A
	MOVE T,B
	SUB T,C
	MOVMS T
	CAMG T,PTNOIS
	JRST UPOTR
UPOT3B:	HRLM B,POTVAL(A)	;SAVE FOR NEXT TIME
	SUB B,C			;GET AMOUNT OF INCREMENT
	CAIL C,5252		;SKIP IF NOT IN UPPER THIRD
	JUMPG B,UPOT4		;JUMP IF IN UPPER THIRD AND GOING UP
	CAIGE C,2525		;SKIP IF NOT IN LOWER THIRD
	JUMPL B,UPOT5		;JUMP IF IN LOWER THIRD AND GOING DOWN
UPOT6:	HRRE C,POTVAL(A)	;GET PREV INCREMENTAL VALUE
	ADD C,B			;UPDATE BY POT INCR
	CAILE C,7777		;IF NEW VALUE WOULD EXCEED 7777
	MOVEI C,7777		;CLAMP IT TO 7777
	CAIGE C,0		;IF NEW VALUE WOULD BE LESS THAN 0
	MOVEI C,0		;CLAMP IT TO 0
	HRRM C,POTVAL(A)	;STORE NEW INCR VALUE
	JSP B,@POTUPD(A)	;CALL ROUTINE TO COMPUTE NEW VARIABLE VALUE
	HRRZ T,POTVPT(A)	;STORE VAR IN USER MEM
	XCTRI XR,[MOVE B,(T)]
	 JRST .+2
	  JRST INARK
	MOVEI D,B
	HLL D,POTVPT(A)
	DPB C,D
	XCTRI XW,[MOVEM B,(T)]	;STORE VAR IN USER MEM
	 JRST UPOTR

INARK:	SETOM POTUSR(A)	;THIS POT A LOSER, FLUSH
	SOS POTCON
	SOS IMPXF
	SOSGE IMXNTO
	DATAO DSDEVN,[MPX]
	JRST UPOTR		;RETURN FOR MORE POTS

UPOT4:	HRREI C,-6(B)		;C_DELTA-6
	IMULI C,3		;C_DELTA*3-22
	CAMLE C,B		;IF POT TURNED UP FAST
	MOVEM C,B		;THEN BOOST INCREMENT
	JRST UPOT6		;RETURN TO STORE

UPOT5:	HRREI C,6(B)		;C_DELTA+6
	IMULI C,3		;C_DELTA*3+22
	CAMGE C,B		;IF POT TURNED DOWN FAST
	MOVEM C,B		;THEN DECREASE DECREMENT
	JRST UPOT6		;RETURN TO STORE

PUFXA:	HLRZ C,POTVAL(A)	;ABS ENTRY, USE DIRECT VALUE
PUFXI:	MUL C,POTSCL(A)		;INCR ENTRY, SCALE VALUE
	ASHC C,25.		;200000,,=FULL WORD
	ADD C,POTOFS(A)		;OFFSET VALUE
	JRST (B)		;RETURN WITH USER FIELD VALUE

PUFLA:	HLRZ C,POTVAL(A)	;ABS ENTRY FOR FLOAT PT
PUFLI:	TLC C,232000		;FLOAT POT VALUE
	FAD C,C			;NORMALIZE
	FMPR C,POTSCL(A)	;SCALE FLOATING VALUE
	FADR C,POTOFS(A)	;ADD OFFSET
	JRST (B)		;RETURN WITH NEW FLOATING VAR VALUE

UPOT3A:	MOVE C,B		;FIRST TIME USE CURRENT VALUE
	JRST UPOT3B


NARK:	SETOM POTUSR(B)	;TURN OFF AND FREE POT CHANNEL
	SOS POTCON	;DECREMENT # OF SLOTS IN USE
	JRST IMXCL1	;FLUSH THIS USE OF MPX AND MAYBE DEASSIGN MPXR

POTCLS:	MOVEI A,NARK	;ON CLOSE FLUSH ALL ENTRIES FOR USER
POTCLA:	MOVSI B,-NPOTCH	;SET UP TO TEST ALL ENTRIES FOR USER U
POTCL1:	CAMN U,POTUSR(B)	;SKIP IF DIFFERENT USER
	PUSHJ P,(A)	;FLUSH IT MAYBE
	AOBJN B,POTCL1	;TRY ALL SLOTS
	POPJ P,	;DONE

EBLK
POTUSR:	REPEAT NPOTCH,-1	;-1=FREE, 0=PROCESS, +=USER INDEX
POTBPT:	BLOCK NPOTCH		;BYTE PTR INTO MPXBUF
POTVPT:	BLOCK NPOTCH		;BYTE PTR INTO USER MEM INDEXED BY R
POTVAL:	BLOCK NPOTCH		;DIRECT VALUE,,INCR VALUE
POTUPD:	BLOCK NPOTCH		;ADDR OF ROUTINE TO COMPUTE NEW VALUE
POTSCL:	BLOCK NPOTCH		;SCALE FACTOR FOR VARIABLE
POTOFS:	BLOCK NPOTCH		;OFFSET FOR VARIABLE
MPXPT:	REPEAT 3,301400-140000*.RPCNT,,MPXBUF	;POINTERS FOR 12 BIT MPX BYTES
UPUSR:	0	;USER FOR WHOM RELOC SETUP AND NOT STOPPED
UPTPGT:	BLOCK 8	;SAVE MAP

POTCON:	-1	;<NUMBER OF POTS CONNECTED>-1

PTNOIS:	3	;IGNORE ANY CHANGE < OR = THIS AS POT NOISE
]

SUBTTL	340 DISPLAY

IFN 340P,[
;
; DISPLAY INTERRUPT ROUTINE
;
DRECYC:	0
;
BBLK
;
	MOVEM A,LPTA
	MOVE A,DRECYC
	MOVEM A,LPTBRK
	MOVE A,[B,,LPTB]
	BLT A,LPTB+17-B+1-1
	JRST DRECY1
SRECYC:	MOVE A,[B,,LPTB]
	BLT A,LPTB+17-B+1-1
	CONSZ DIS,2000
	JRST DSLTPB	;LIGHT PEN BREAK
	SKIPGE 340MD
	JRST SRCYRB	;RANDOM BREAK
	CONSZ DIS,5000
	JRST SRCY4
DRECY1:
;	DATAI 710,A
;	SUB A,LQTIM
;	CAIL A,32000./2
;	JRST DISF2	;MISSING CLOCK BREAK DUE TO DIS
	HLRE A,DBLKOP
	SKIPL A
	TDZA A,A
	MOVNS A
	ADDB A,DWDS	;CREDIT BACK WDS NOT USED
	JUMPL A,DISF2
	HRRZS DBLKOP
	SKIPE 340MD
	JRST SRCY3	;IDS OR DIS
SRCY1:	HRRZ A,LDISP
	JUMPE A,ENDLIS
	JSP B,DPFTCH
	JUMPL A,SRCY2A	;SINGLE BLKO PNTR
	MOVEM A,LDISP	;LIST
	HLRZS A
	JUMPE A,SRCY5	;THIS ENTRY NULL
	JSP B,DPFTCH
	SKIPGE LMODE
	JRST SRCY1A	;DSTRT
SRCY1C:	JUMPGE A,SRCY5
	MOVEM A,LUBLKP	;SAVE FOR DEBUGGING
	HLRO C,A
	MOVNS D,C	;+ COUNT
	LDB E,[1200,,A]	;WD WITHIN PG
	ADD E,D
	LSH E,-10.
	AOS E
	MOVE J,E	;SAVE # EXEC PGS REQD
	SUBI E,N340PB
	JUMPG E,SRCY2B	;CANT MAKE IT IN ONE WHACK
	MOVN Q,E	;SAVE MAX ACCEPT STARTING EXEC PG #
	HRLZS E
	HRRZ C,A
	CAIGE C,20
	JRST DISLOS
	ANDI C,776000	;USER PG #
	MOVNI R,1	;BEST STARTING PLACE SO FAR
SRCY2D:	CAMN C,340DA(E)	;LOOK FOR PG SET UP TO RIGHT USER PG
	JRST SRCY2F	;FOUND ONE
SRCY2I:	AOBJN E,SRCY2D
	HRRZ E,R
	JUMPGE R,SRCY2C	;PARTIALLY SET UP PLACE FOUND
	AOS 340DP
	CAML Q,340DP	;NONE AVAIL, IS RING PNTR IN ACCEPTABLE AREA?
	SKIPA E,340DP	;YES
	CLEARB E,340DP	;NO RESET
SRCY2C:	MOVE R,DDAD(E)
	LSH R,-10.
	DPB R,[121000,,A]	;SWITCH BLKO PNTR TO EXEC MD PG
	MOVEM A,LDBLKP
	MOVEM A,DBLKOP
	HLRES A		;FOR GROSS DISPLAY LISTS
	ADDM A,DWDS	;APPROX TO WDS TO DISPLAY
	IDIVI A,1000.
	SOS A	;QUOTIENT MAY BE ZERO
	MOVEM A,DISDIE
	MOVNI A,EWRT
	ADDM A,DWDS
	ADDI E,2	;OFFSET FOR POINTER PAGES
	MOVEI A,0
SRCY2E:	CAME C,A340P1(E)	;PG SET TO RIGHT ADR?
	JRST SRCY2J	;NO SET UP
SRCY2K:	ADDI C,2000
	AOS E
	SOJG J,SRCY2E	;SET UP ALL PGS IN BLOCK
	CONSZ DIS,5400
	CONO DIS,100\SDCHN_3\DISCHN
	JRST SRCYCX

SRCY2J:	JSP B,DDFTC
	MOVEI B,-2(E)
	MOVEM B,340DP
	JRST SRCY2K

SRCY2B:	JRST DISLOS	;TEMP

SRCY2F:	MOVE D,J	;FIRST PAGE MATCHES, DO ENOUGH ADDITIONAL PAGES MATCH?
	SOJLE D,SRCY2C	;ONLY ONE PAGE NEEDED.  WINS
	MOVEI TT,2000(C)
	MOVEI R,1(E)
SRCY2H:	CAME TT,340DA(R)
	JRST SRCY2G	;NOT SET UP FOR WHOLE BLOCK
	ADDI TT,2000
	AOS R
	SOJG D,SRCY2H
	JRST SRCY2C	;SET UP FOR WHOLE BLOCK.  WIN

SRCY2G:	HRRZ R,E	;SAVE BEST SO FAR
	JRST SRCY2I
DPFTCH:	HRRZ C,A
	CAIGE C,20
	JRST DISLOS
	TRZ C,1777
	MOVSI E,-N340PB-2
DPFTC2:	CAME C,A340P1(E)	;PG SET UP TO RIGHT ADR?
	JRST DPFTC1	;NO
	TRZ A,776000	;YES RETCH REL ADR
	XCTRI [MOVE A,@DPAP(E)]
	 JRST (B)	;NO FAULT
	JRST 4,.	;SHOULD HAVE BEEN VERIFIED WHEN LOADED

DPFTC1:	AOBJN E,DPFTC2	;LOOP ON ALL EXEC PNTR PAGES
	MOVE E,340PP	;NONE SET UP SO SELECT ONE TO SET UP
	AOS D,340PP	;INCR IT FOR NEXT TIME
	CAILE D,1
	CLEARM 340PP	;RESET
DDFTC:	SPM DPBS	;ENTRY FOR DATA PGS STORE MAP
	SKIPGE U,DISUSR
	JRST 4,.
	SKIPL CIRPSW
	JRST DDFTC2	;MAP MIGHT CHANGE
	SKIPGE A340P1(E)
	JRST DDFTC3
	SETOM A340P1(E)	;WIPE OUT OLD ENTRY
	LDB W,DPEP(E)	;PICK UP OLD PAGE
	TRZN W,600000	;NO ACCESS
	JRST 4,.
	ANDI W,PMRCM
	CAIL W,TSYSM
	JRST 4,.
	MOVEI R,0
	DPB R,DPEP(E)
	SKIPGE DDEXCF+340P1(E)
	JRST DDFTC3
	LDB R,[MUR,,MEMBLT(W)]
	CAIE R,MURUSR
	JRST 4,.
	MOVSI R,-1
	ADDM R,MMSWP(W)	;REDUCE COUNT OF EXEC REFS
DDFTC3:	MOVE W,C	;SET PAGE IN E TO PNT TO ADR IN C
	LSH W,-10.	;GET USR PG #
	ROT W,-1	;GET WD # AND SAVE WHICH HALF IN SIGN
	ADDI W,UPGMP(U)
	HLRZ R,(W)
	SKIPGE W
	HRRZ R,(W)	;PICKS UP PAGE ENTRY
	HLRZ T,UPGCP-UPGMP(W)
	SKIPGE W
	HRRZ T,UPGCP-UPGMP(W)
	TRNN R,600000
	JRST DDFTC1	;NO ACCESS OR SWAPPED OUT
	LDB Q,[PMRCAD,,R]
	CAIN T,-1
	JRST DDFTC4	;ABS PG
	CAILE Q,TSYSM
	JRST 4,.
	SKIPGE MEMBLT(Q)
	JRST DDFTC2	;CAN'T SET UP EXEC PG POINTING TO THIS ONE
	LDB TT,[MUR,,MEMBLT(Q)]
	CAIE TT,MURUSR
	JRST 4,.
	CLEARM DDEXCF+340P1(E)
	MOVSI TT,1
	ADDM TT,MMSWP(Q)	;AOS COUNT OF EXEC PGS
DDFTC5:	MOVEM C,A340P1(E)
	DPB R,DPEP(E)	;STORE USERS PG ENTRY IN EXEC MAP
	LPMR DPBS	;RESET ASSOC REG
	ANDI A,1777	;FLUSH USER ADR EXCEPT WD IN PAGE
	XCTRI [MOVE A,@DPAP(E)]	;REF PAGE TO MAKE SURE ITS THERE, ETC
	 JRST (B)
	JRST 4,.

DDFTC4:	SETOM DDEXCF+340P1(E)	;INDICATE PAGE POINTING TO ABS PAGE
	JRST DDFTC5

DDFTC1:	JUMPE R,DISLOS	;MAP COMPLETELY 0 MUST BE ILM
	JUMPE T,DISLOS	;ILM
	MOVEM U,DISSWI
	LDB W,[121000,,C]
	MOVEM W,DISSPG	;RQ PG IN
DDFTC2:	MOVNI A,3	;HANG FOR 3 60THS
	JRST DISF2A

SRCY1A:	JUMPGE A,SRCY1B
	MOVEI A,-1(A)
SRCY1D:	JSP B,DPFTCH
	SOJA A,SRCY1C

SRCY1B:	TLNN A,777000
	JRST SRCY5
	HLRZ A,LDISP
	JRST SRCY1D

SRCY3:	SOSGE DTIME
	JRST DISF	;LIMIT REPETITION RATE
	SKIPL NDSFMS	;SKIP ON FRAME HACK NOT ACTIVE
	JSP B,ENDFM1	;MAYBE STOP DISPLAY AFTER SPEC # OF FRAMES
	MOVE A,IDBLKP
	MOVEM A,DBLKOP
	CONO DIS,100\SDCHN_3\DISCHN
	SETOM DISDIE
	JRST SRCYCX

SRCY4:	CONO DIS,200\SDCHN_3\DISCHN	;EDGE GRONK DIS AND KEEP GOING
	JRST SRCYCX

DISF2:	MOVNI A,300.
DISF2A:	MOVEM A,DTIME
	SETOM DISON
	JRST DISF3

DISF:	SETOM DISON
DISF1:	MOVEI A,1
	MOVEM A,DTIME
DISF3:	CONO DIS,100
DISF4:	MOVEI A,DIS300-1
	MOVEM A,DBLKOP
SRCYCX:	MOVE A,[JSR DBLKPB]
SRCYB1:	MOVEM A,40+2*DISCHN
SRCYB2:	JRST LPTRT1

DIS300:	3000
	3000

DCRSTP:	SKIPE 340MD	;STOP DISPLAY FOR CORE SHUFFLING
	 POPJ P,	;BUFFER NOT IN USER CORE SO NO ACTION
DCRST1:	SETOM CDISOF
	CONO DIS,0
	POPJ P,

DCRRST:	SKIPE 340MD	;DISPLAY RESTART
	 POPJ P,
	SKIPL DISOFF
	 CONO DIS,SDCHN_3+DISCHN
	CLEARM CDISOF
	POPJ P,

DSLTPB:	DATAI DIS,LLTPSN
	AOS LTPCNT
	HRRZ A,LLTPSN
	ADDM A,LTPCY
	HLRZ A,LLTPSN
	ADDM A,LTPCX
	SKIPGE B,DISUSR
	JRST 4,.
	MOVEI A,%PILTP
	AND A,MSKST(B)
	IORM A,PIRQC(B)
	CONO DIS,@LTPDCN
	JRST SRCYCX

EBLK

DBLKP1:	0
DBLKPB:	0

BBLK
	MOVEM A,DBLKP1
	MOVE A,[BLKO DIS,DBLKOP]
	MOVEM A,40+2*DISCHN
	MOVE A,DBLKP1
	JRST 12,@DBLKPB

SRCYRB:	CONI DIS,A
	SKIPGE A
	CONO DIS,100	;WOULD ASSIGN IF IDLE
	MOVE A,[JSR DIGNOR]
	JRST SRCYB1

EBLK

DIGNOR:	0

BBLK
	CONO DIS,0
	DATAO DSDEV,[DSNDIS]
	JRST 12,@DIGNOR

ENDLIS:	SETOM DISDIE
	MOVE A,DROOT
	MOVEM A,LDISP
	SOSGE DTIME
	JRST DISF	;LIMIT REPETION RATE
	SKIPL NDSFMS
	JSP B,ENDFM1	;HACK FRAME HACK
	CONO DIS,100\SDCHN_3\DISCHN
	JRST SRCY1

ENDFM1:	SKIPE NDSFMS	;STOP DISPLAY IF SPEC # OF FRAMES UP ELSE RETURN
	SOSGE NDSFMS
	JRST ENDFM2	;STOP WORLD
	JRST (B)

ENDFM2:	SETOM DISOFF
	JRST DISF1

SRCY5:	MOVNI A,EWRT/2
	ADDB A,DWDS
	JUMPGE A,SRCY1
	JRST DISF2

DISLOS:	SKIPE 340MD
	JRST 4,.
	SKIPGE A,DISUSR
	JRST 4,DISF2A
	MOVEI B,%PIDIS
	IORM B,PIRQC(A)
	MOVSI A,(SETZ)
	JRST DISF2A	;DIE FOR A LONG TIME

SRCY2A:	SOSGE DTIME
	JRST DISF
	SKIPL NDSFMS
	JSP B,ENDFM1
	CONO DIS,100\SDCHN_3\DISCHN
	JRST SRCY1C


SUBTTL	340 DISPLAY - .DSTART, .DSTRTL

DISACR:	CAME U,DISUSR
	POPJ P,
	SKIPE 340MD	;COME HERE IF PAGE BEING FLUSHED + EXEC PAGE POINTING TO IT
	JRST 4,.	;SHOULD NOT BE SET UP TO USER PAGE
	CONO PI,UTCOFF
	SETOM A340P1-340P1(T)
	SKIPGE DDEXCF(T)
	JRST DISAC1
	ADDB J,MMSWP(TT)
	SKIPGE J
	JRST 4,.
DISAC1:	SKIPGE DISOFF
	JRST POPJ1
	PUSH P,T
	PUSHJ P,DISZAP
	POP P,T
	JRST POPJ1

;ROUTINES TO START 340 DISPLAY WITH DIS BUFF IN USERS CORE
ADSTART:	TDZA E,E	;CALL 10,
ADSTL:	MOVNI E,1	;CALL 12,
	MOVEI A,0
	PUSHJ P,ADSDV
	POPJ P,
	SETOM DISOFF
	CONO DIS,0
	CLEARM 340MD
	MOVEM E,LMODE
	HRRZ C,40
	MOVEM C,DROOT
	MOVEM C,LDISP
	SETZM DISOFF
	PUSHJ P,DISZAP
	JRST CLKOJ1

ANDIS:	CAME U,DISUSR
	POPJ P,
	UMOVE A,(J)
	JUMPL A,ANDIT1	;WAIT FOR COMPLETION OF LAST NDIS
	JUMPE A,ANDIT2	;RETURN COUNT LEFT FROM LAST NDIS
	MOVEM A,NDSFMS	;DISPLAY N TIMES AND THEN STOP
	SKIPL DISOFF
	JRST POPJ1
	SETOM DISDIE
	CLEARM DISOFF
	PUSHJ P,DISZAP
	JRST POPJ1

ANDIT1:	SKIPL DISOFF
	PUSHJ P,UFLS
	POPJ P,

ANDIT2:	MOVE A,NDSFMS
	JRST APTUAJ

SUBTTL	340 DISPLAY - .DSTOP, .DCLOSE, .LTPEN
ADSTOP:	CAMN U,DISUSR	;OPER 16
	SKIPGE DISOFF
	POPJ P,
ADCLB:	PUSH P,B
	PUSH P,C
	MOVSI C,-1
	SETOM DISOFF
	SETZM DBLINK
	CONO DIS,0
	MOVEI A,1
	MOVEM A,DTIME
	SETZM DISON
	SETOM DISDIE
	CONO PI,UTCOFF
	MOVSI A,-N340CL
ADCLB1:	SETOM A340P1(A)
	LDB B,DPEP(A)
	ANDI B,600000+PMRCM
	SKIPGE DDEXCF+340P1(A)
	JRST ADCLB2	;POINTING TO EXEC PG
	TRZE B,600000
	ADDM C,MMSWP(B)
ADCLB2:	AOBJN A,ADCLB1
	CLEARM 340PP
	CLEARM 340DP
	CLEARM EXEUMP+.340P1
	REPEAT N340PB/2,CLEARM EXEUMP+.DPG0+.RPCNT
	MOVE A,[JSR DIGNOR]
	MOVEM A,40+2*DISCHN
	CONO PI,UTCON
	POP P,C
	JRST POPBJ

ADCL1:	SOSE DISNTO
	POPJ P,
	JRST AIDS7

ADCLOSE:	CAME U,DISUSR	;OPER 15
	POPJ P,
	SKIPLE 340MD
	JRST AIDS8
AIDS7:	PUSHJ P,ADCLB
	PUSHJ P,ADCL2
	JFCL
AIDS9:	SETOM 340MD
	SETOM DISUSR
	DATAO DSDEV,[DSNDIS]	;DEASSIGN DIS
	POPJ P,

AIDS8:	MOVE A,U	;FLUSH CHNLS IN CASE OF .DCLOSE FROM DIS OR IDS
	PUSHJ P,CHSCAA
	PUSHJ P,ADSDV4
	JRST AIDS7

ALTPEN:	MOVE C,B
	CAME U,DISUSR	;CALL 14,
	JRST ALTPP2
	XCTR XR,[SKIPL A,(C)]
	JRST ALTPP1
	TLNN A,377777
	JRST .+3
	SKIPN LTPCNT
	PUSHJ P,UFLS
ALTPP1:	CONO PI,LPTOFF	;INHIBITS LPEN BREAKS
	MOVE A,LDISP
	XCTRI XW,[MOVEM A,4(C)]
	 SKIPA A,DBLKOP
	  JRST ALTPPL
	TRZ A,400000
	LDB B,[121000,,A]
	LDB B,[121000,,A340P1-340P1(B)]
	DPB B,[121000,,A]
	XCTRI XW,[MOVEM A,5(C)]
	 SKIPA B,C
	  JRST ALTPPL
	HRLI B,LLTPSN
	XCTRI XBW,[BLT B,3(C)]
	 JRST .+2
	  JRST ALTPPL
	SETZB A,LTPCNT
	MOVEM A,LTPCY
	MOVEM A,LTPCX
	JRST LPTONJ

ALTPP2:	XCTR XW,[SETZM (C)]
	XCTR XW,[SETZM 1(C)]
	POPJ P,

ALTPPL:	CONO PI,LPTON
	PUSHJ P,TPFLT
	JRST ALTPEN

SUBTTL	340 DISPLAY

ADSDV:		;A HAS NEW 340MD
	CONO PI,CLKOFF
	CONI DIS,T	;DIS AVAILABLE
	JUMPN T,ADSDV1	;YES
	CONO DIS,0
	CONI DIS,T
	JUMPE T,ADSDVN	;DIS NOT AVAIABLE
ADSDV1:	SKIPL T,DISUSR
	CAMN U,DISUSR
	JRST ADSDVY	;YES
	CAME U,UMASTER
	JRST ADSDVM	;MAYBE
ADSDV2:	SKIPGE A,DISUSR	;TAKE AWAY DISPLAY
	JRST ADSDV3
	PUSHJ P,RPCCK
ADSDV7:	SKIPL DISUSR
	SKIPG 340MD
	JRST ADSDV3
	PUSH P,R
	PUSHJ P,CHSCAA	;CHANGE 340 CHANNELS TO NUL DEV
	PUSHJ P,ADSDV4
	POP P,R
	SETZM DISNTO
ADSDV3:	MOVE A,340MD
ADSDVY:	SETZM DBLINK
	SETOM NDSFMS	;TURN OFF FRAMER HACK
	CAME A,340MD
	JUMPE A,ADSDV5	;SAME USER CLOBBERING HIS IDS OR DIS
ADSDV6:	PUSHJ P,ADCLB
	MOVEM U,DISUSR
ADCL2:	SKIPGE A,340BF
	JRST CLKOJ1
	LSH A,-10.
	PUSHJ P,MEMR
	SETOM 340BF
	JRST CLKOJ1

ADSDV4:	HRRZ Q,(R)
	CAIG Q,DN340L
	CAIGE Q,DN340B
	POPJ P,		;NOT A 340 CH
	CAIL Q,DN340C
	SKIPA T,[NLODN]	;UNIT MODE
	MOVEI T,NLBDN	;BLOCK MODE
	SOS DISNTO
	HRRM T,(R)
	POPJ P,

ADSDV5:	SKIPGE 340MD
	JRST ADSDV6
	MOVE A,DISUSR
	JRST ADSDV7

ADSDVM:	CAMN T,UMASTER
	JRST ADSDVN	;CURRENT USER UMASTER
	MOVE T,UTMPTR(U)
	MOVE T,TTYTYP-USRRCE(T)	;GET BITS FOR NEW GUY IN LH OF T
	HRR T,DISUSR
	HRR T,UTMPTR(T)
	HLR T,TTYTYP-USRRCE(T)
	TRNE T,%TT3HP
	JRST ADSEQ1	;CURRENT USER HAS HIGH PRIORITY
	TRNE T,%TT340
	JRST ADSEQ2	;CURRENT USER NEAR 340
	TLNN T,%TT340+%TT3HP	;GIVE TO NEW GUY IF HE IS EITHER
	JRST ADSEQ
ADSWIN:	JRST ADSDV2

ADSEQ1:	TLNN T,%TT3HP
	JRST ADSDVN	;NO
ADSEQ:	SKIPL TTYTBL(U)	;MAYBE
	JRST ADSWIN
ADSDVN:	JRST CLKONJ

ADSEQ2:	TLNE T,%TT3HP
	JRST ADSWIN
	TLNN T,%TT340
	JRST ADSDVN
	JRST ADSEQ

SUBTTL	340 DISPLAY AS ASCII DEVICE

DISO:	PUSHJ P,AIDS1
	JRST OPNL10	;NOT AVAILABLE
	AOS DISNTO
	SETOM 340DMD
	LDB B,[20200,,D]
	AOS B
	LSH B,4
	MOVEM B,CSCALE
	LDB TT,[40200,,CSCALE]
	MOVNS TT
	MOVEI T,170.
	LSH T,(TT)
	TRZ T,7
	MOVEM T,DISCHS	;CHARS THAT WILL FIT THIS SIZE
	MOVEI T,88.
	LSH T,(TT)
	MOVEM T,DISLNL	;LINES THAT WILL FIT
	PUSHJ P,DSIZAP
	MOVSI T,-1777
	HRR T,340BF
	SOS T
	MOVEM T,IDBLKP
	SETZM DISOFF
	PUSHJ P,DISZAP
	SETOM 340T
	JSP Q,OPSLD3
	DN340C,,DN340B
	DN340H,,DN340W

340FF:	SKIPL 340T
	JRST 340FF1
	MOVE A,TIME
	MOVEM A,340T
340FF1:	MOVE T,340T
	ADDI T,30.*3
	CAML T,TIME
	PUSHJ P,UFLS
	SETOM 340T
	PUSHJ P,ADCLB
	PUSHJ P,DSIZAP
	JRST DISZAP

DSIZAP:	SETZM DBLOAT
	SETZM 340XMD
	SETZM DBLINK
	MOVE T,340BF
	MOVEI A,34117
	IOR A,CSCALE
	MOVEM A,(T)
	PUSH T,[221700060000]
	HRLI T,0600
	MOVEM T,340BFP
	MOVE A,[403737403737]
	MOVEI B,1(T)
	HRLS B
	AOS B
	MOVEM A,1(T)
	BLT B,1775(T)
	MOVE A,DISLNL
	MOVEM A,DISLNS
	MOVE A,DISCHS
	MOVNM A,DISCHC
	MOVEI T,(HRRZ I,(A))
	HRLM T,AIDC1
	POPJ P,


340B:	MOVEI E,340D
	JRST NBTOCH

340C:	SKIPGE C
	 SKIPA A,(C)
	  UMOVE A,(C)
	ANDI A,177
340D:	CAIN A,^C
	POPJ P,
	CAIN A,^L
	JRST 340FF
	CAIN A,^T
	JRST DSIZAP
	SKIPE DISLNS
	SKIPGE DBLOAT
	POPJ P,
	CAIN A,^B
	JRST BLNKON
	CAIN A,^E
	JRST BLNKOF
	SKIPE 340XMD
	PUSHJ P,340D1	;ENTER CHR MOD INF NOT ALREADY
340E:	EBLK
AIDC1:	HRRZ\HLRZ I,DISTBL(A)
	BBLK
	TRNN I,-100
	JRST 340FC	;NORMAL CHR
	TRNN I,-200
	JRST 340K	;FAKE OUT 340 NON-SPACING CHRS
	PUSHJ P,(I)	;ROUTINE DISPATCH (MAY SKIP OR SKIP TWICE)
	JRST 340E	;WRONG CASE OR SOMETHING, TRY AGAIN
340F:	IDPB I,340BFP
340F2:	MOVE J,340BFP
	ANDI J,1777
	CAIL J,1776
	SETOM DBLOAT
	POPJ P,

340FC1:	SKIPL DISCHC	;DISPLAY IF COUNT NOT OUT BUT DONT INCR COUNT
340FC:	AOSG DISCHC	;INCR COUNT + DISPLAY IF NOT OUT
	JRST 340F
	JRST 340F2

340HD1:	SKIPN 340XMD	;ESCAPE TO PARAM MODE
	PUSHJ P,340H1
340D1:	MOVEI I,74117	;PARAM WD
	IOR I,CSCALE
	PUSHJ P,340F	;STORE PARAM WD
	MOVEI I,6
	DPB I,[300600,,340BFP]	;SWITCH TO CHR MODE
	SETZM 340XMD
	POPJ P,

340K:	MOVEI I,40	;SPACE TO MAKE SPACING
	PUSHJ P,340FC1
	XCT AIDC1	;GET NON-SPACING LETTER AND DISPLAY
	JRST 340FC

340W:	JSP Q,WRDBT
	XCTR XRW,[MOVSS (C)]
	PUSHJ P,340H
	XCTR XRW,[MOVSS (C)]
340H:	SKIPGE DBLOAT
	POPJ P,
	SKIPN 340XMD
	PUSHJ P,340H1	;ENTER HALF WD MODE IF NOT ALREADY
	UMOVE I,(C)	;PICK UP LOSERS HALF WD
	JRST 340F

340H1:	MOVEI I,37	;IN CHR MODE, EXCAPE
	PUSHJ P,340F
	LDB I,[360600,,340BFP]
	JUMPE I,340H2
	CAIE I,22
	JRST 340H1
340H2:	MOVEI A,22
	DPB A,[300600,,340BFP]
	SETOM 340XMD
	POPJ P,

BLNKON:	MOVE A,DBLINK
	CAIL A,DBLNKN
	POPJ P,
	PUSHJ P,340HD1
	MOVE B,340BFP
	AND B,[770060,,1777]	;ADR OF PARAM WD TO BLINK INTEN OF
	TLO B,300+B
	MOVE A,DBLINK
	MOVEM B,DBLNKB(A)
	AOS DBLINK
	MOVEI T,15.
	PUSHJ P,CLQADD
	BLINKB
	JRST 340F2

BLNKOF:	PUSHJ P,340HD1
	JRST 340F2

BLNKBR:	SKIPN A,DBLINK
	JRST CLQRET	;BLINKING TURNED OFF
	SKIPL B,340BF
	SKIPGE CDISOFF
	JRST BLNKB3
	MOVE C,DBLNKF
BLNKB2:	DPB C,DBLNKB-1(A)
	SOJG A,BLNKB2
	SETCMM DBLNKF	;COMPLEMENT FLAG
BLNKB3:	MOVEI T,15.	;1/4 SEC
	MOVEI C,BLINKB
	JRST CLQREE

SUBTTL	340 DISPLAY

AIDS1:	MOVEI A,2
	PUSHJ P,ADSDV	;DETERMINE IF THIS LOSER SHOULD GET DISPLAY
	POPJ P,
AIDS3:	PUSHJ P,TCALL
	JRST IOMQ
	JRST AIDS2	;NO MEM AVAIL
	MOVEI B,MUDISB
	MOVE T,A
	LSH T,10.
	MOVEM T,340BF
	DPB B,[MUR,,MEMBLT(A)]
	MOVEI B,2
	MOVEM B,340MD
	JRST POPJ1

AIDS2:	SKIPG MEMFR
	 JRST AIDS9
	PUSHJ P,LOSSET
	    AIDS9
	PUSHJ P,UDELAY
	PUSHJ P,LSWDEL
	JRST AIDS3

IFN 0,[
;INTERPRETIVE DISPLAY COMPILER

IDISO:	PUSHJ P,AIDS1
	JRST OPNL10	;NOT AVAIL
	AOS DISNTO
	SETZM 340DMD
	SETOM AISWS
	HRLI T,442200
	MOVEM T,340BFP
	MOVEI Q,10135	;TURN OFF LP SCALE 1 INT 5
	IDPB Q,340BFP
	MOVEI T,1_4
	MOVEM T,CSCALE
	MOVEM T,VSCALE
	MOVEM T,ISCALE
	MOVSI A,(MOVE)	;DONT HACK CHR'S PER LINE
	MOVEM A,DISCHS
	MOVNM A,DISCHC
	CONO DIS,500
	MOVEI A,DN340I
	JRST OPNSLT


340I:	MOVEM C,AIDPCP
	UMOVE C,(C)

AIDL:	UMOVE R,(C)
AIDL2:	TRNE R,1
	JRST AIDL1	;NOT CHR MODE
	MOVEI Q,(HRRZ I,(A))
	HRLM Q,AIDC1
	MOVE Q,CSCALE
	IORI Q,60100
	PUSHJ P,AIDPY
	MOVE J,[220600,,Q]
AIDCL:	MOVE B,[440700,,R]
AIDC3:	ILDB A,B
EBLK
AIDC1:	HRRZ\HLRZ I,DISTBL(A)
BBLK
	TRNN I,-100
	JRST AIDC5
	TRNN I,-200
	JRST AIDC7
	PUSHJ P,(I)
	JRST AIDC1
AIDC5:	IDPB I,J
	TLNN J,770000
	PUSHJ P,AIDC2
	TLNE B,760000
	JRST AIDC3
	AOS C
	UMOVE R,(C)
	MOVE I,UEXIT
	CAMN I,[JRST ONEFLS]
	JRST AIDC6
	TRNN R,1
	JRST AIDCL
AIDC6:	MOVEI I,37
	IDPB I,J
	TLNE J,770000
	JRST .-2
	PUSHJ P,AIDC2

AIDL1:	MOVE B,UEXIT
	CAMN B,[JRST ONEFLS]
	JRST AIDI
	LDB B,[30300,,R]
	AOJA C,@AIDTB(B)

AIDC7:	MOVEI I,40
	PUSHJ P,AIDC4
	XCT AIDC1
	JRST AIDC5

AIDI:	MOVE R,AIDPCP
	UMOVEM C,(R)
	SOS UUOH
	JRST UUOE1

AIDTB:	AIER1
	AIPT
	AIVC
	AIINC
	AIOP
	AIVC
	REPEAT 2,AIER1

AIPT:	LDB I,[251600,,R]	;PICK UP Y
	SUB I,DWDB
	MOVEI TT,220000
	DPB I,[1200,,TT]
	LSH I,-10.
	ANDI I,17
	MOVEM I,YFLD
	LDB I,[61600,,R]	;X
	SUB I,DWDL
	MOVEI E,0
	TRNE R,2
	TRO E,2000	;INTENSIFY
	DPB I,[1200,,E]
	LSH I,-10.
	ANDI I,17
	MOVEM I,XFLD
	MOVEI Q,20000
	PUSHJ P,AIDPY
	MOVE Q,TT
	PUSHJ P,AIDPY
	MOVE Q,E
	PUSHJ P,AIDPY
	JRST AIDL

AIDC4C:	SKIPL DISCHC
	POPJ P,
	JRST AIDC4
]
AIDC4B:	AOSLE DISCHC
	POPJ P,
AIDC4:
IFN 0,[
	SKIPGE 340DMD
	JRST AIDC4A	;DIS
	IDPB I,J
	TLNE J,770000
	POPJ P,
AIDC2:	PUSHJ P,AIDPY
	MOVEI Q,0
	MOVE J,[220600,,Q]
	POPJ P,
]
AIDC4A:	IDPB I,340BFP
	POPJ P,
IFN 0,[
AIDPY:	HRLS Q
	DATAI DIS,AIDPIC
	DATAO DIS,Q
AIDP1:	MOVEI H,50
AIDP1A:	CONSZ DIS,DVEF+DHEF	;EDGE FLAGS
	JRST DEGFS
	CONSO DIS,200
	SOJG H,AIDP1A
	JUMPE H,AIER2
	CONSZ DIS,DVEF+DHEF
	JRST DEGFS
	SKIPN XFLD
	SKIPE YFLD
	JRST AIDP2
DEG4B:	HRRZ H,340BFP
	SUB H,340BF
	CAIL H,1777
	JRST AIER3
	IDPB Q,340BFP
AIDP2:	MOVEI Q,0
	POPJ P,

DEGFS:	DATAI DIS,DEGVCC
	CONI DIS,H
	LSH H,-15.
	ANDI H,7
	CAIN H,4	;VECTOR
	JRST DEGVC
	SKIPN XFLD
	SKIPE YFLD
	JRST DEG5A
	MOVEI Q,400000
	CAIN H,3
	MOVEI Q,373737
	PUSH P,H
	PUSHJ P,DEG4B	;LEAVING INSERT APPROPRIATE ESCAPE INSTEAD
	POP P,H
DEG5A:	CONO DIS,200
	MOVEI TT,50.
	CONSO DIS,DVEF+DHEF+200
	SOJG TT,.-1
	JUMPE TT,AIER2
	CONSO DIS,200
	JRST DEG5A	;RIDE OUT TO FINAL EDGE
	DATAI DIS,TT
	XOR TT,AIDPIC
	TRNN TT,1000
	JRST DEG5B
	HRR TT,AIDPIC
	TRNE TT,1000
	AOS XFLD
	TRNN TT,1000
	SOS XFLD
DEG5B:	TLNN TT,1000
	JRST DEG4
	HLL TT,AIDPIC
	TLNN TT,1000
	SOS YFLD
	TLNE TT,1000
	AOS YFLD
	JRST DEG4

DEG5:	MOVE TT,DEGVCC
	CONSZ DIS,DVEF
	JRST DEG1
DEG3:	CONSO DIS,DHEF
	JRST DEG4
	TRNE TT,1000
	SOS XFLD
	TRNN TT,1000
	AOS XFLD
DEG4:	MOVEI TT,0
	DPB TT,[44000,,XFLD]
	DPB TT,[44000,,YFLD]
	CONSO DIS,200
	CONO DIS,200	;CONTINUE
	MOVEI TT,100.
	CONSO DIS,200+DVEF+DHEF
	SOJG TT,.-1
	JUMPE TT,AIER2
	SKIPN XFLD
	SKIPE YFLD
	JRST AIDP1	;NOT COMING ON
DEG4F:	DATAI DIS,TT
	CAIN H,4
	MOVE TT,DEGVCC
	PUSH P,Q	;COMING ON PRODUCE SETPOINT
	PUSH P,H
	MOVEI Q,20100
	IOR Q,@DEGSCT(H)
	PUSHJ P,DEG4B
	HLRZ Q,TT
	IORI Q,220000
	PUSHJ P,DEG4B
	HRRZ Q,TT
	CONI DIS,H
	LSH H,-15.
	DPB H,[150300,,Q]
	MOVE TT,(P)
	CAIN TT,4
	JRST DEGVC1
DEG4D:	SUB P,[2,,2]
	JRST AIDP1

DEGSCT:	[0]
	[0]
	[0]
	CSCALE
	VSCALE
	VSCALE
	ISCALE
	[0]

DEG1:	TLNE TT,1000
	SOS YFLD
	TLNN TT,1000
	AOS YFLD
	JRST DEG3

DEGVC:	SETOM DEGVCF
	SKIPN XFLD
	SKIPE YFLD
	JRST DEG5	;NOT GOING OFF
	CLEARM DEGVCF
	HRRZ A,AIDPIC
	HLRZ B,AIDPIC
	PUSHJ P,DEG4C
	CONSZ DIS,DVEF
	SUBI B,2
	CONSZ DIS,DHEF
	SUBI A,2
	SKIPGE A
	MOVEI A,0
	SKIPGE B
	MOVEI B,0
	DPB B,[100700,,Q]
	DPB A,[700,,Q]
	TRO Q,400000
	PUSHJ P,DEG4B
	JRST DEG5

DEGVC1:	SKIPN XFLD
	SKIPE YFLD
	SKIPLE DEGVCF
	JRST .+2
	JRST DEG4D	;VECTOR TOTALLY OUT OF IT
	IORI Q,100000
	PUSHJ P,DEG4B
	POP P,H
	POP P,Q
	DATAI DIS,A
	HLRZ B,A
	HRRZS A
	PUSHJ P,DEG4C
	DPB B,[100700,,Q]
	DPB A,[700,,Q]
	MOVE A,DEGVCC
	MOVEM A,AIDPIC
	JRST AIDP1

DEG4C:	HRRZ I,DEGVCC
	SUB A,I
	HLRZ I,DEGVCC
	SUB B,I
	MOVMS A
	MOVMS B
	CAIGE A,1000
	JRST .+3
	MOVNS A
	ADDI A,2000
	CAIGE B,1000
	JRST .+3
	MOVNS B
	ADDI B,2000
	LDB I,[40200,,VSCALE]
	MOVNS I
	ASH A,(I)	;GET X INC IN A
	ASH B,(I)	;Y IN B
	POPJ P,

AIINC:	MOVE Q,ISCALE
	IORI Q,140100
	PUSHJ P,AIDPY
	SETOM DDINCI
	MOVEI Q,0
	MOVE B,[200400,,Q]
AIIN1:	MOVE D,[440600,,R]
AIIN8:	ILDB T,D
	LDB E,[200,,T]	;LOAD COUNT
	JUMPE E,AIIN5	;NULL INCREMENT
AIIN7:	TRNN T,4	;SKIP ON INTENSIFY
	JRST AIIN2
	SKIPG DDINCI	;SKIP ON SET TO INTENSIFY
	JRST AIIN3

AIIN7A:	LDB H,[30300,,T]
	MOVE H,DINCT(H)
	IDPB H,B
	PUSHJ P,AIIN6	;MAYBE START NEW WORD
	SOJG E,AIIN7

AIIN5:	TLNE D,700000
	JRST AIIN8
	UMOVE R,(C)
	LDB H,[30300,,R]
	TRNE R,1
	CAIE H,3	;INC MODE
	TROA Q,400000
	AOJA C,AIIN1
	PUSHJ P,AIIN6A
	JRST AIDL2

AIIN6:	TLNE B,770000
	POPJ P,

AIIN6A:	PUSHJ P,AIDPY
	MOVEI Q,0
	SETOM DDINCI
	MOVE B,[200400,,Q]
	POPJ P,

AIIN2:	SKIPN DDINCI
	JRST AIIN7A	;INTENSITY AGREES
AIIN3:	SKIPL DDINCI
	PUSHJ P,AIIN6A
	HRRZM P,DDINCI
	TRNE T,4
	TROA Q,200000
	CLEARM DDINCI
	JRST AIIN7

AIVC:	MOVE Q,VSCALE
	IORI Q,100100
	LDB A,[251700,,R]	;DY
	LDB B,[61700,,R]	;DX
	TRNE A,40000
	ORCMI A,77777
	TRNE B,40000
	ORCMI B,77777
	MOVM E,A
	MOVM TT,B
	MOVE H,VSCALE
	LSH H,-4
	ANDI H,3
	MOVNS H
	LSH E,(H)
	LSH TT,(H)
	JUMPN E,.+2
	JUMPE TT,AIDL
	PUSHJ P,AIDPY
AIVCL:	MOVE H,E
	MOVE J,TT
AIVC3:	CAIG J,177
	CAILE H,177
	JRST AIVC2
	SUB E,H
	DPB H,[100700,,Q]
	SKIPGE A
	TRO Q,1_<8+7>
	SUB TT,J
	DPB J,[700,,Q]
	SKIPGE B
	TRO Q,1_7
	TRNE R,1_1
	TRO Q,200000
	JUMPN E,.+3
	JUMPN TT,.+2
	TRO Q,400000
	PUSH P,A
	PUSH P,B
	PUSH P,E
	PUSH P,TT
	PUSHJ P,AIDPY
	POP P,TT
	POP P,E
	POP P,B
	POP P,A
	JUMPN E,AIVCL
	JUMPN TT,AIVCL
	JRST AIDL

AIVC2:	LSH J,-1
	LSH H,-1
	JRST AIVC3

AIOP:	LDB B,[60300,,R]
	JRST @AIOPT(B)

AIOPT:	AIER5
	AIPSJ
	AIPPJ
	AIJMP
	AIPSH
	AIIPOP	;5
	AIPS
	AIER5
	AIER5

AIPSJ:	XCTR XRW,[AOS D,43]	;PICK UP PDL PNTR AND INCR
	XCTR XRW,[MOVEM C,(D)]	;STORE RETURN PC
AIJMP:	HLRZ C,R
	JRST AIDL

AIPPJ:	UMOVE D,43
	XCTR XRW,[HRRZ C,(D)]
	JUMPE C,AIEXT	;POPJ INTO 0 START SIGNAL
	XCTR XRW,[SOS 43]
	JRST AIDL

AIEXT:	SKIPL AISWS
	JRST AIDST3
AIDST:	MOVEI Q,3000
	PUSHJ P,DEG4B
	MOVE A,340BF
	ADD A,[-2000-1,,-1]
	MOVEM A,IDBLKP
	MOVEM A,DBLKOP
	MOVEI A,1
	MOVEM A,DTIME
	SETZM DISOFF
	CONO DIS,1100\DISCHN\SDCHN_3
AIDST3:	POPJ P,

AIPSH:	HLRZ TT,R
	UMOVE TT,(TT)
	XCTR XRW,[AOS D,43]
	UMOVEM TT,(D)
	JRST AIDL

AIIPOP:	HLRZ TT,R
	XCTR XRW,[SOS D,43]
	UMOVE E,1(D)
	UMOVEM E,(TT)
	JRST AIDL

AIPS:	LDB A,[140600,,R]
	HLRZ B,R
	CAIL A,AIMXP
	JRST AIER7
	ANDI B,3
	LSH B,4
	XCT AIPST(A)
	JRST AIDL

AIPST:	JRST AIER7
	HLLEM R,AISWS	;START MODE
	MOVEM B,CSCALE
	MOVEM B,ISCALE
	MOVEM B,VSCALE
	JRST AIPSA
	HLRM R,DWDL
	HLRM R,DWDB
AIMXP==.-AIPST

AIPSA:	MOVEM B,CSCALE
	MOVEM B,ISCALE
	MOVEM B,VSCALE
	JRST AIDL
]
EBLK
XFLD:	0	;HIGH ORDER BITS OF X COOR REG (LIGHT=0)
YFLD:	0	;  ... Y
CDISOF:	0	;DISPLAY OFF IN CORE ALLOC
340BF:	-1	;POINTER TO 1K BLOCK FOR 340 BF (MEM ADR)
340BFP:	0	;POINTER TO 340BF
	DBLNKN==10.
DBLINK:	0	;0=IDLE ;+N=NUM OF ENTRIES
DBLNKF:	0	;BLINK FLAG, -1 MEANS START BLINK OFF
DBLNKB:	BLOCK DBLNKN	;BYTE POINTER TO PARAMETER HW TO CHANGE
BLINKB:	0	;CLOCK QUEUE BLOCK
	-1
	JRST BLNKBR
AIDPCP:	0	;USER LOCN WHERE TO STORE BACK PC IF NECC
CSCALE:	0	;SCALE FOR CHR WRDS
ISCALE:	0	;SCALE FOR INCREMENT
VSCALE:	0	;SCALE FOR VECTOR WDS
DWDL:	0	;14 BIT COOR OF LH 340
DWDB:	0	;14 BIT COOD OF BOT 340
DEGVCF:	0	;EDGE FLAG FOR VECT -1 UNLESS GOING AWAY
DEGVCC:	0	;COORD AT EDGE
DDINCI:	0	;-1 CURRENT INTENSITY NOT COMMITED (IN INCREMENT MODE)
	;+ => 1 - => 0
AISWS:	0	;SELECT DISPLAY START MODE -1 STARTS DISPLAY AFTER IOT
AIDPIC:	0	;COORDINATES AT START OF AIDPY

LLTPSN:	0	;. TO .+3 BLTED TO USER
LTPCNT:	0
LTPCY:	0
LTPCX:	0
LTPDCN:	200\SDCHN_3\DISCHN

LDISP:	0	;DISPLAY LINK POINTER
LMODE:	0	;LISP LINK MODE FLAG
DISOFF:	-1	;-1 IF DIS NOT IN USE OR STOPPED DUE TO FRAME HACK
DTIME:	0

340MD:	-1	;MODE IN WHICH DISPLAY OPEN
		;-1 NOT DISPLAYING 0 .DSTART ETC 2 AS DIS OR IDS
340DMD:	0	;0 IDS -1 DIS
340XMD:	0	;IN DIS, 0=CH 1=IMAGE
DBLOAT:	0
340T:	0	;TIMER FOR DIS PAGE
LUBLKP:	0	;LAST USER BLKO PNTR SET UP AT IN LEVEL, FOR DEBUGGING

;START 340 EXECPG AREA

A340P1:	-1	;USER ADR THAT EXEC PG SET UP FOR
A340P2:	-1
340DA:	REPEAT N340PB,-1
N340CL==.-A340P1	;THIS BLOCK MUST BE CONSEC
340DP:	0	;0=> N30PB-1 PNTR TO DATA PGS
340PP:	0	;PNTR TO 340P1 OR P2 ALTNERATELY

DPAP:	400000+340P1*2000(A)	;EXEC ADR TO REF PAGE
	400000+340P2*2000(A)
DDAD:	REPEAT N340PB, 400000+<DPG0+.RPCNT>*2000(A)

DPEP:	.340P1+EXEUMP	;BYTE PNTR TO EXEC MAP PAGE ENTRY
	.340P2+EXEUMP
DDEP:	REPEAT N340PB, CONC .DPG,\.RPCNT,+EXEUMP

DPBS:	BLOCK 8	;SAVE PAGE BOX AT PI DIS LVL

DROOT:	0	;DIS RESTART POINTER TO LOSER CORE
DBLKOP:	0	;TEMP DIS BLKO PTR
LDBLKP:	0	;LAST
DISON:	0	;-1 IF DIS STOPPED AFTER SPECIAL INT OR BLKO OVERFLOW
		;IE RESTART AFTER PASSAGE OF TIME
DISDIE:	0	;0	;-1 IF DIS HASNT DIED
DISTPR:	0	;-1 TO TURN OFF DISPLAY
IDBLKP:	0	;BLKO PNTR IF IN INTERP DISPLAY MODE
NDSFMS:	-1	;-1 NOT HACKING FRAME HACK ELSE NUMBER OF FRAMES REMAINING
DISNTO:	0	;# TIMES DIS OR IDS OPEN
DWDS:	0	;- # WDS SENT TO DIS-EWRT PER TRIP THRU SRECYC
		;RESET TO MDISWD EVERY 1/30
		;IF <0 DISPLAY STOPS FOR 5 SEC -300.->DTIME

DISCHS:	0	;LENGTH OF LINE IN CURRENT SIZE
DISCHC:	0	;-# CHR POS REMAINING
DISLNL:	0	;# OF LINES WILL FIT CURRENT SIZE
DISLNS:	0	;# LINES REMAINING
BBLK

DEFINE LC A
A,,DISLC
TERMIN

DEFINE UC A
DISUC,,A
TERMIN

DEFINE AC A
A,,A
TERMIN



ADISCR:	MOVE I,DISCHS
	MOVNM I,DISCHC
	MOVEI I,34
	JRST POPJ1

DISALF:	SOS DISLNS
	MOVEI I,33
	JRST POPJ1

DSATB:	MOVEI I,40	;B
	PUSHJ P,AIDC4B
	LDB I,[300,,DISCHC]
	SKIPG DISCHC
	JUMPN I,DSATB
	JRST POPJ2

DISBLB:	MOVEI I,50	;DOWN ARROW
	PUSHJ P,AIDC4B
	TRO A,100	;CONVERT TO UC LETTER
DISUC:	SKIPA I,[HRRZ I,35(A)]	;SWITCH TO UC
DISLC:	MOVE I,[HLRZ I,36(A)]	;SWITCH TO LC
	PUSHJ P,AIDC4	;STORE CASE CODE
	HLLM I,AIDC1
	POPJ P,

ADISBS:	MOVEI I,72	;BACKSPACE
	SOS DISCHC
	JRST POPJ1

DISRUB:	MOVEI I,"X&77	;LC X
	PUSHJ P,AIDC4
	MOVEI I,72	;340 BACKSPACE
	PUSHJ P,AIDC4
	MOVEI A,"O	;YES, A
	POPJ P,	;LOOP BACK

DISTBL:	POPJ2,,POPJ2	;IGNORE 0
	REPEAT 6,LC DISBLB
	LC 63	;BELL
	LC ADISBS
	AC DSATB
	AC DISALF
	LC DISBLB
	LC DISBLB
	AC ADISCR
	REPEAT 33-16,LC DISBLB
	LC 47	;ALT MD (RT ARROW)
	REPEAT 4,LC DISBLB
	AC 40
	REPEAT 133-41,UC <.-DISTBL>&77
	LC 53
	LC 52	;BACKSLASH
	LC 54
	LC 100+67
	LC 60
	LC 100+66
	REPEAT 173-141,LC <.-DISTBL-140>
	LC 55
	LC 62	;VERTICAL BAR=174
	LC 56
	LC 43	;TILDE=176
	LC DISRUB
IFN .-DISTBL-200,PRINTX /DISTBL LOSS/


DINCT:	10
	2
	14
	3
	12
	16
	17
	13



REPEAT NDOPL, CONC AIER,\.RPCNT+1,:	JSP D,AIER

AIER:	HRRZ R,UUAC(U)
	ADDI R,IOCHNM(U)
	MOVEI D,1+1-AIER1(D)
	LSH D,6+18.
	IORM D,IOCHST-IOCHNM(R)
	MOVE T,AIDPCP
	UMOVEM C,(T)
	JRST IOCERR
]

IFN VIDP,[
;
SUBTTL	NEW VIDISECTOR ROUTINES
;
TVCO:	HLRZ D,C
	SKIPA Q,[TVCOBK]
NVIDI:	MOVEI Q,NVDOBK
	PUSH P,R
	PUSH P,[NVIDI2]
	JRST STDOP1

NVIDI2:	JRST POPAJ
	POP P,R
	PUSHJ P,NVDGET
	JRST NVIDI3
NVIDI1:	MOVEM A,(R)
	CAIN Q,TVCOBK
	AOS NTVCOS
	CAIN Q,TVCOBK
	TLNE C,1	;ONLY DO IF TVC OUTPUT OPEN
	PUSHJ P,TVCNOS
	JRST POPJ1

NVIDI3:	PUSHJ P,OPNL25
	JRST NVDCLS

NVDOBK:	1,,NVDUSR
	NVIDOP,,BNVIDO

BNVIDI:	JSP Q,WRDBT
NVIDIT:	SKIPGE NVDIFL
	PUSHJ P,UFLS
	UMOVE B,(C)
	MOVEM B,NVDCOR
	CONO PI,OMXOFF
	SETOM NVDIFL
	PUSHJ P,NVDVS1	;TURNS OMPCH ON
	SKIPGE NVDIFL
	PUSHJ P,UFLS
	MOVE B,NVDCOR
	UMOVEM B,(C)
	POPJ P,

RNVDIB:	JSP Q,WRDBT
RNVDIU:	SKIPN NVDCNT	;TVC INPUT
	JRST RNVDO2
	XCTR XRW,[MOVES (C)]	;MAKE SURE GOING TO WIN
	MOVE T,NVDOPT
	CAMN T,NVDVPT
	PUSHJ P,UFLS
	MOVE B,(T)
	SOS NVDCNT
	UMOVEM B,(C)
	AOS T,NVDOPT
	CAIL T,NVDBUF+NVDLNG
	MOVEI T,NVDBUF
	MOVEM T,NVDOPT
	POPJ P,

TVCOBK:	3,,NVDUSR
	DNVDIU,,DNVDOU
	DNVDIB,,DNVDOB

TVCCLS:	SOSGE NTVCOS
	PUSHJ P,TVCINI	;TRY TO AVOID GARBAGE PNT PART WAY VIDISECTED
NVDCLS:	SOSGE NVDUSE
	PUSHJ P,VIDFLS
	POPJ P,

TVCNOS:	LDB A,[251700,,C]	;TVC OPEN ROUTINE
TVCN1:	TRZ A,703000	;DONT LET LOSER FOOL AROUND
	IORI A,NVDCHN_15.
	LDB B,[20300,,A]	;DCO
	JUMPE B,TVCO3
	CAIN B,7
	JRST TVCO6	;DCO DISABLED FOR DCL=7
	IMUL B,[-100]
TVCO4:	ADDI B,1300
TVCO7:	MOVEM B,NVDDK	;DARK VALUE CORRECT FOR DCO
	MOVE TT,A
	XOR TT,TVCONO
	TRNE T,340
	JRST TVCO5	;CHANGE IN VIDI SELECTION STATUS
TVCO5A:	MOVEM A,TVCONO
	POPJ P,

TVCO3:	LDB T,[200,,A]	;CONF
	CAIN T,3
	MOVNI B,100	;IF CONF=3 & DCO=0 VALUE 100 LESS THAN PREDICTED ABOVE
	JRST TVCO4

TVCO5:	TRZ A,700000	;CLEAR CHNL OUT OF TVCONO
	CONO NVDX,(A)	;START RLYS
	MOVEI T,2
	SKIPL TVQBLK+1	;WAIT IF PREV RQ NOT SATISFIED
	PUSHJ P,UFLS
	PUSHJ P,CLQADD	;RQ LATER TRANSFER TO VIDD1
	TVQBLK
	JRST TVCO5A

TVCO6:	LDB T,[200,,A]	;CONF
	IMUL T,[-200]	;CALCULATE WHEN OVF HAPPENS
	ADDI T,2000
	JRST TVCO7

TVCINI:	CONO PI,OMXOFF
	SETZM NVDCNT
	MOVE T,NVDIPT
	MOVEM T,NVDVPT
	MOVEM T,NVDOPT
	MOVE T,NVDBKR
	CAIN T,1
	SETOM NVDBKR
	JRST OMXONJ

VIDFLS:	SKIPL NVDUSE	;SKIP IF OPENS ON NVD, .VSCAN
	POPJ P,
	DATAO DSDEV,[DSNVID]	;DEASSIGN VIDI
	SETOM NVDUSR
	POPJ P,

NVDGET:	CONO NVDX,@TVCONO	;TRY TO ASSIGN BAT
	CONI NVDX,TT
	JUMPE TT,CPOPJ
	JRST POPJ1


NVDBRK:	MOVE T,NVDBKR
	JRST NVTAB(T)	;DISPATCH ON REASON FOR BREAK

	JRST NEWORK	;STARTUP OF SOME NEW FUNCTION
NVTAB:	JRST SCNB1	;NEW VSCAN POINT
	JRST TVB1	;NEW TVC POINT
	JRST INVD1	;NEW NVD PNT
;	JRST DRET	;NEW DAEMON POINT

TVB1:	DATAI NVDX,@NVDVPT	;READ IN OF TV POINT
	CONI NVDX,T
	LSH T,-11.
	DPB T,[220200,,@NVDVPT]	;READ ALL RELAVENT INFO FROM BAT
	TRNE T,3
	JRST TVB2	;DCO OR OVFL
	MOVE T,@NVDVPT
	ANDI T,1777
	CAMLE T,NVDDK
	JRST TVB2	;DUE TO NOISE/PROB DARKER THAN DCO
TVB3:	AOS T,NVDVPT
	CAIL T,NVDBUF+NVDLNG
	MOVEI T,NVDBUF
	MOVEM T,NVDVPT	;INCREMENT TO NEXT POINT
	JRST NEWORK

TVB2:	MOVE T,NVDDK
	DPB T,[1200,,@NVDVPT]
	DPB T,[240600,,@NVDVPT]	;PUT IN FLOATING PART
	LSH T,-6
	DPB T,[330400,,@NVDVPT]
	JRST TVB3

TVNEXT:	MOVE T,NVDVPT
	CAMN T,NVDIPT
	JRST TVCFIN
	MOVEI T,1	;SET UP FOR NEXT TV POINT
	MOVEM T,NVDBKR
	MOVE T,NVDVPT
	HLRZ T,@NVDVPT
	CONO NVDX,@TVCONO
	DATAO NVDX,T
	EXCH T,VIDXOL
	SUB T,VIDXOL
	MOVMM T,VIDTEM
	HRRZ T,@NVDVPT
	DATAO NVDY,T
	EXCH T,VIDYOL
	SUB T,VIDYOL
	MOVMS T
	CAMGE T,VIDTEM
	MOVE T,VIDTEM
	CAIL T,1000
	JRST TVB5
	DATAO NVDT,[-4]
NVDBR4:	JRST OMXRET

TVB5:	TLC T,232000	;CALCULATE SETTLING TIME
	FAD T,T
	LDB T,[330400,,T]
	DATAO NVDT,SETLL-10.(T)
	JRST NVDBR4

SETLL:		;SETTLING TIME IN 10 MICROSEC
	-6	;DEFLECTING 512 - 1023 
	-10	;1024 - 2047
	-16	;2048 - 4095
	-26	;4096 - 8191
	-45	;8192 - 16383
	-70	;16384

RNVDOB:	JSP Q,WRDBT
RNVDOU:	MOVEI T,NVDLNG-1	;TO PREVENT HANGUP AT PI ON WRAPAROUND
	CAMG T,NVDCNT
	JRST RNVDO2
	UMOVE B,(C)
	MOVEM B,@NVDIPT
	AOS NVDCNT
	AOS T,NVDIPT
	CAIL T,NVDBUF+NVDLNG
	MOVEI T,NVDBUF
	MOVEM T,NVDIPT
	CONO PI,OMXOFF
	SETOM TVFLG
NVDVS1:	MOVE T,TVCONO
	SKIPGE NVDBKR
	CONO NVDX,2000(T)
	JRST OMXONJ

RNVDO2:	POP P,T	;CALLED FROM RNVDI ALSO
	ANDI T,-1
	CAIE T,WRDBRT
	JRST IOCER9
	POPJ P,

NEWORK:;	SKIPGE DAEMFL
;	JRST DNEXT
	SKIPL SCNUSR	;DEFLECT FOR NEW VSCAN POINT
	JRST SCNB2
	SKIPGE NVDIFL	;NVD
	JRST INVD2
	SKIPGE TVFLG	;DEFLECT FOR NEW TVC POINT
	JRST TVNEXT
	SETOM NVDBKR	;NO MORE CROCKS FOR VIDISECTOR TO DO
	MOVE T,TVCONO
	TRZ T,703000	;SAVE STATE OF VIDI SELECT
	CONI NVDX,A
	CONO NVDX,(T)
	SKIPN A
	DATAO DSDEV,[DSNVID]	;RE DEASSIGN VIDI IF WAS DEASSIGNED 
			;(CONO DID CLEAR PIA, DONE, AND SET MODE FLOPS THO)
	JRST OMXRET

TVCFIN:	SETZM TVFLG
	JRST NEWORK

INVD1:	DATAI NVDX,NVDCOR
	CONI NVDX,T
	LSH T,-11.
	DPB T,[220200,,NVDCOR]
	SETZM NVDIFL
	JRST NEWORK

INVD2:	MOVEI T,2
	MOVEM T,NVDBKR
	CONO NVDX,@TVCONO
	HLRZ T,NVDCOR
	DATAO NVDX,T
	HRRZ T,NVDCOR
	DATAO NVDY,T
	DATAO NVDT,[-7]
	JRST NVDBR4

SUBTTL	NEW VIDISECTOR ROUTINES - .VSTST

AVSTST:	UMOVE A,(J)
	CAME U,NVDUSR
	JRST AVST4
	JUMPE A,AVST1	;READ CURRENT STATE
	JUMPL A,AVST2
AVST3:	SKIPL SCNUSR	;HANGUP TILL VSCAN FINISHED
	PUSHJ P,UFLS
AVST2:
SCNSTP:	CONO PI,OMXOFF	;FLUSH VSCAN ENTIRELY
	SKIPGE SCNUSR
	JRST OMXONJ	;ALREADY FINISHED
	SETOM SCNUSR
	SOSGE NVDUSE
	SETOM NVDUSR
	SKIPN NVDBKR	;IGNORE VSCAN POINT IN PROGRESS IF ANY
	SETOM NVDBKR
VSLS2:	PUSH P,A
	PUSH P,B
	PUSH P,W
	MOVSI B,-1
	MOVSI W,-2
SCNS2:	LDB A,VEXT(W)
	TRNN A,600000
	JRST SCNS4
	ANDI A,PMRCM
	ADDM B,MMSWP(A)
SCNS4:	MOVEI A,0
	DPB A,VEXT(W)
	AOBJN W,SCNS2
	MOVE A,USER
	SPM UPGML(A)
	LPMR UPGML(A)
	POP P,W
	POP P,B
	POP P,A
	PUSHJ P,VIDFLS
	JRST OMXONJ

AVST4:	JUMPE A,ILUUO
	POPJ P,

AVST1:	SKIPGE SCNUSR
	POPJ P,
	MOVE A,NVDPTR
	SUBI A,400000+VSB1*2000
	JRST APTUAJ

;CHECK TO SEE IF MEM PROTECT STILL OK
SCNACR:	CAMN U,SCNUSR
	POPJ P,
	AOS (P)
	JRST SCNSTP

;STOP SCAN
SCNSTC:	CONO NVDX,0
	POPJ P,

;RESTART SCAN AFTER STOP FOR SHUFFLING
SCNRST:	CONO NVDX,NVDCHN_17
	POPJ P,


SUBTTL	NEW VIDISECTOR ROUTINES - .VSCAN

AVSCAN:	XCTR XRW,[MOVES (C)]
	XCTR XRW,[MOVES 12(C)]
	SKIPL SCNUSR
	PUSHJ P,UFLS
	CONO PI,CLKOFF
	CAME U,NVDUSR
	SKIPGE NVDUSE
	AOSA NVDUSE
	JRST ILUUO
	MOVEM U,NVDUSR
	CONO PI,CLKON
	PUSHJ P,NVDGET
	JRST VSLOS
A.VS1:	SETZM BATMXA
	XCTR XRW,[HLRZ A,2(C)]
	MOVEM A,NVDCNX
	MOVEM A,NVDCN3
	XCTR XRW,[HRRZ A,2(C)]
	MOVEM A,NVDCNY
IRPS XY,,X Y P X Y P,A12,,1 1 1 2 2 2,N,,3 6 11 4 7 12,YX,,X X X Y Y Y
	UMOVE A,N(C)
	IDIV A,NVDCN!YX
	MOVEM A,BATD!XY!A12
TERMIN
IRP XY,,[P,X,Y]ADR,,[[[1,,]],5(C),10(C)]
	MOVE A,BATD!XY!1
	ADD A,BATD!XY!2
	ASH A,-1
IFE .IRPCNT,	ADD A,ADR
IFN .IRPCNT,	XCTR XRW,[ADD A,ADR]
	MOVEM A,BAT!XY!1
	MOVEM A,BAT!XY!2
	IFN .IRPCN,[IDIV A,BATP1
	MOVEM A,NVID!XY]
TERMIN
	XCTR XRW,[HRRZ B,1(C)]
	LDB A,[121000,,B]
	CAIL A,376
	JRST VSLOS
	MOVEI W,0
	PUSHJ P,VSMS1
	MOVEI W,1
	PUSHJ P,VSMS1
	SPM UPGML(U)
	LPMR UPGML(U)
	HRRZ R,B
	ANDI R,776000
	ADDI R,4000-2000
	XCTR XRW,[HLRO D,1(C)]
	MOVE A,NVDCNX
	IMUL A,NVDCNY
	JUMPLE A,VSLOS	;SIZE OF RASTOR
	MOVNS D		;PLUS COUNT
	CAMLE A,D
	JRST VSLOS	;WON'T FIT
	CAML A,R
	JRST VSLOS	;WON'T FIT IN EXEC PGS
	ADD A,B
	MOVEM A,BATMXA
	LDB A,[121000,,A]
	PUSHJ P,UPLC
	LDB A,T
	TRC A,600000
	TRCE A,600000	;SKIP ON R/W/F
	JRST VSLOS	;TOP PAGE LOSES
	ANDI B,1777
	ADDI B,400000+VSB1*2000
	MOVEM B,NVDPTR
	XCTR XRW,[HRRZ A,(C)]
	PUSHJ P,TVCN1
	MOVE A,[JRST SCNG1]
	MOVEM A,SCNB1A
	CONO PI,OMXOFF
	MOVEM U,SCNUSR
	MOVE A,TVCONO
	SKIPGE NVDBKR
	CONO NVDX,2000(A)
	CONO PI,OMXON
	XCTR XRW,[SKIPL (C)]
	POPJ P,
	JRST AVST3

VSLS3:	PUSHJ P,LSWPOP
VSLOS:	PUSHJ P,VSLS1
	JRST ILUUO


VPGLOS:	PUSHJ P,VSLS1
	PUSHJ P,TPFLT
	JRST UUOTRO

VSLS1:	SOSGE NVDUSE
	SETOM NVDUSR
	CONO PI,OMXOFF
	JRST VSLS2

VSMS1:	PUSHJ P,SWTL
	CIRPSW
	LDB A,[121000,,B]
	ADD A,W
	MOVEM A,VSMPG
	PUSHJ P,UPLC
	CONO PI,CLKOFF
	LDB A,Q
	JUMPE A,VSMS2	;NO ACCESS
	CAIN A,-1
	JRST VSLS3
	LDB A,T
	TRNN A,600000
	JRST VSMS3	;SWAPPED OUT
	TRNN A,400000
	JRST VSLS3	;RD ONLY
	TRO A,200000
VSMS2:	DPB A,T		;CHANGE R/W/F TO R/W
	LDB TT,VEXT(W)
	DPB A,VEXT(W)
	MOVSI Q,1
	ANDI A,PMRCM
	SKIPE A
	ADDM Q,MMSWP(A)
	JUMPE TT,VSLS4
	ANDI TT,PMRCM
	MOVSI Q,-1
	ADDM Q,MMSWP(TT)
VSLS4:	PUSHJ P,LSWPOP
	JRST CLKONJ

VSMS3:	PUSHJ P,LSWPOP
	MOVE A,VSMPG
	SOSGE NVDUSE
	SETOM NVDUSR
	PUSHJ P,CWAIT
	SKIPL VIDSWI
	MOVEM U,VIDSWI
	MOVEM A,VIDSPG
	SKIPL VIDSWI
	PUSHJ P,UFLS
	SUB P,[1,,1]
	JRST AVSCAN
SCNB1:	DATAI NVDX,@NVDPTR
	CONI NVDX,T
	LSH T,-11.
	DPB T,[220200,,@NVDPTR]
	TRNE T,3
	JRST SCNB1C	;OVF OR DCO?
	MOVE T,@NVDPTR
	ANDI T,1777
	CAMG T,NVDDK	;OR VALUE GREATER THAN DCO LEVEL
	JRST NEWORK
SCNB1C:	MOVE T,NVDDK
	DPB T,[1200,,@NVDPTR]
	DPB T,[240600,,@NVDPTR]	;PUT IN FLOATING PART
	LSH T,-6
	DPB T,[330400,,@NVDPTR]
	JRST NEWORK

SCNB2:	CONO NVDX,@TVCONO	;SETUP FOR NEXT VSCAN POINT
	DATAO NVDX,NVIDX
	DATAO NVDY,NVIDY
	MOVE T,NVIDX
	EXCH T,VIDXOL
	SUB T,VIDXOL
	MOVMM T,VIDTEM
	MOVE T,NVIDY
	EXCH T,VIDYOL
	SUB T,VIDYOL
	MOVMS T
	CAMGE T,VIDTEM
	MOVE T,VIDTEM
	CAIL T,1000
	JRST SCNT5
	DATAO NVDT,[-4]
SCNT4:	CLEARM NVDBKR
	EBLK
SCNB1A:	JRST SCNG1	;OR AOS (AOSA) NVDPTR
	BBLK
	JRST SCNS1	;HOMO LINEAR FROB
SCNB1B:	SOSG NVDCNX	;SIMPLE MINDED
	JRST SCNB3
IRPC X,,XY
	MOVE T,BATD!X!1
	ADDB T,BAT!X!1
	HLRZM T,NVID!X
TERMIN
SCNBX:	JRST OMXRET

SCNT5:	TLC T,232000	;CALCULATE SETTLING TIME
	FAD T,T
	LDB T,[330400,,T]
	DATAO NVDT,SETLL-10.(T)
	JRST SCNT4

SCNB3:	SOSG NVDCNY
	JRST SCNB4
IRPC X,,XY
	MOVE T,BATD!X!2
	ADDB T,BAT!X!2
	MOVEM T,BAT!X!1
	HLRZM T,NVID!X
TERMIN

	MOVE T,NVDCN3
	MOVEM T,NVDCNX
	JRST SCNBX

SCNB4:	SKIPL NVDCNY	;WAIT FOR LAST DATAO TO RETURN A POINT
	JRST SCNBX
	SETOM SCNUSR
	SOSL NVDUSE
	JRST NEWORK
	SETOM NVDUSR
	DATAO DSDEV,[DSNVID]	;DEASSIGN BAT
	MOVSI B,-1
	MOVSI W,-2
SCNB4B:	LDB A,VEXT(W)
	TRNN A,600000
	JRST SCNB4A
	ANDI A,PMRCM
	ADDM B,MMSWP(A)
SCNB4A:	MOVEI A,0
	DPB A,VEXT(W)
	AOBJN W,SCNB4B
	JRST NEWORK

SCNS1:	MOVEM U,NVDTMU
	SOSG NVDCNX
	JRST SCNS3
IRPC X,,PXY
	MOVE T,BATD!X!1
	ADDB T,BAT!X!1
	IFN .IRPCN,[IDIV T,BATP1
	MOVEM T,NVID!X]
TERMIN

SCNBX1:	MOVE U,NVDTMU
	JRST SCNBX

SCNS3:	SOSG NVDCNY
	JRST SCNB4
IRPC X,,PXY
	MOVE T,BATD!X!2
	ADDB T,BAT!X!2
	MOVEM T,BAT!X!1
	IFN .IRPCN,[IDIV T,BATP1
	MOVEM T,NVID!X]
TERMIN
	MOVE T,NVDCN3
	MOVEM T,NVDCNX
	JRST SCNBX1

SCNG1:	MOVSI T,(AOSA)
	SKIPN BATDP1
	SKIPE BATDP2
	MOVSI T,(AOS)
	HRRI T,NVDPTR
	MOVEM T,SCNB1A
	TLNN T,(AOSA-AOS)
	JRST SCNS1
	JRST SCNB1B


SUBTTL	NEW VIDISECTOR ROUTINES

EBLK

NVDIPT:	NVDBUF	;POINTER TO INSERT IN BUF
NVDVPT:	NVDBUF	;POINTER TO WORD  BEING VIDISECTED
NVDOPT:	NVDBUF	;POINTER TO WITHDRAW FROM BUF
NVDCNT:	0	;NUMBER PTS IN BUF
NVDBUF:	BLOCK NVDLNG
VIDSTRT:	0
LBTCNO:	0	;LAST CONO TO BAT
NVDIFL:	0	;+=> RQ TO READ NVD PNT
NVDCOR:	0	;NVD DEV, COORDINATES TO PI, READ DATA FROM PI
NTVCOS:	-1	;# TVC OPENS

IRPC X,,XYP
	IRPC N,,12
		BAT!X!!N:	0
		BATD!X!!N:	0
	TERMIN
TERMIN

NVDCNX:	0
NVDCNY:	0
NVDCN3:	0
NVIDX:	0
NVIDY:	0
BATMXA:	0
NVDPTR:	0
NVDTMU:	0
SCNUSR:	-1	;USER IN CURRENT .VSCAN, -1 .VSCAN FREE
SCNREL:	0
TVCONO:	0	;CONO FOR TVC DEVICE AND VSCAN (NORM HAS CHNL BUT NOT IF IN VIDDLY)
NVDDK:	0	;-1=>VID VALUE CORRESP TO DCO
TVFLG:	0	;-1=>TVC WORK IN PROGRESS
NVDBKR:	-1	;REASON LAST POINT READ IN, DISPATCH ADDRESS FOR INTS
			;-1 NONE  0 VSCAN  1 TVC  2 NVD
TVQBLK:	0	;CLOCK QUEUE BLOCK
	-1
	JRST VIDD1
VIDXOL:	0	;OLD VIDI CORDS
VIDYOL:	0	;OLD VIDI CORDS
VIDTEM:	0	;LARGEST DELTA
VSMPG:	0
VEXT:	.VSB1+EXEUMP
	.VSB2+EXEUMP

BBLK

VIDD1:	MOVEI A,NVDCHN_15.
	IORB A,TVCONO	;RESTORE CHNLS TO TVCONO
	CONO NVDX,2000(A)	;CAUSE EVENTUAL VIDI INT TO SEE IF ANYTHING YO DO
	JRST CLQRET	;RETURN TO CLOCK ROUTINE
]

SUBTTL	VIDEO SWITCH AND VIDEO BUFFER ROUTINES

;SYSTEM CALLS FOR HACKING THE VIDEO SWITCH AND VIDEO BUFFERS.

IFE N11TYS,[
NVDBF==OPNL1
NVIDSW==OPNL1
]

IFN N11TYS,[

VBDFLS:	PUSH P,B
	PUSH P,T
	PUSH P,I
	PUSH P,Q
	PUSH P,C
	MOVSI B,-MXVBN	;FLUSH ALL BUFFERS ASSIGNED TO JOB IN U
VBDFL3:	CAMN U,VBAST(B)
	 JRST VBDFL1
VBDFL2:	AOBJN B,VBDFL3
	SKIPE NVDBA(U)
	 JRST 4,.
VBDFL6:	POP P,C
	POP P,Q
	POP P,I
	POP P,T
	POP P,B
	POPJ P,

VBDFL1:	JSP Q,11CM1
	 JRST VBDFL4	;LOST..
	PUSH P,B
	JSP Q,NVDBU2	;FLUSH BUFFER
	 JFCL		;PDP11 TIMED OUT
	 JFCL		;PDP11 GAVE NEGATIVE REPLY
	POP P,B
	JRST VBDFL2

VBDFL5:	CAMN U,VBAST(B)
VBDFL4:	 SETOM VBAST(B)
	AOBJN B,VBDFL5
	CLEARM NVDBA(U)
	JRST VBDFL6

;VIDBUF SYSTEM CALL - ASSIGN OR DEASSIGN VIDEO BUFFERS
NVDBF:	JSP Q,11CM1	;SET UP ACS, LOCK SWITCH.
	 JRST OPNL7	;LOST
	JUMPGE A,NVDBU1	;JUMP IF DEASSIGN COMMAND
	MOVSI C,2_<16.+4-18.>
	JSP Q,NVDCMD	;TELL PDP11 TO ASSIGN BUFFER.
	 JRST OPNL7	;PDP11 TIMED OUT
	 JRST OPNL6	;PDP11 GAVE NEGATIVE REPLY
	HRRZ A,C
	CAIL A,MXVBN
	 JRST OPNL6	;PDP11 HAS MORE VIDEO BUFFERS THAN WE DO
	AOS NVDBA(U)	;WON
	MOVEM U,VBAST(A)
	JRST POPJ1

NVDBU1:	MOVE B,A	;DEASSIGN VIDEO BUFFER
	CAIGE B,MXVBN	;CHECK THAT VIDEO BUFFER IS LEGAL
	 CAME U,VBAST(B) ;AND BELONGS TO THIS JOB
	  JRST OPNL33	;NOT LEGAL VIDEO BUFFER NO
	JSP Q,NVDBU2	;TELL PDP11 TO FREE THE BUFFER.
	 JRST OPNL7	;TIMED OUT
	 JRST OPNL23	;GAVE NEG REPLY
	JRST POPJ1	;WON

EBLK
;TABLE OF VIDEO BUFFER ASSIGNMENTS.
VBAST:	REPEAT MXVBN,-1	;-1 => FREE, ELSE USR IDX.
11CVSR:	-1 ? 0		;SWITCH TO LOCK TO PROTECT 10-TO-11 COMMAND VARS.
BBLK

;VIDSW SYSTEM CALL - SET VIDEO SWITCH.
NVIDSW:	JSP Q,11CM1	;LOCK SWITCH, ETC.
	 JRST OPNL7
	LSH A,4.+16.
	LSH B,4.+16.
	MOVEM A,1(I)
	MOVEM B,2(I)
	MOVSI C,1_<16.+4-18.>
	JSP Q,NVDCMD
	 JRST OPNL7	;TIMED OUT
	 JRST OPNL23	;PDP11 DIDN'T FEEL LIKE SWITCHING THE SWITCH
	JRST POPJ1

NVDBU2:	SETOM VBAST(B)	;GIVE DEASSIGN COMMAND TO 11
	LSH B,4.+16.
	MOVEM B,1(I)	;WHICH ONE TO DEASSIGN
	SOSGE NVDBA(U)
	 JRST 4,.
	MOVSI C,3_<16.+4-18.>
;GIVE COMMAND IN C TO PDP11, WAIT, RETURN (Q) IF 11 TIMES OUT,
;1(Q) IF 11 GIVES NEGATIVE REPLY AND 2(Q) IF SUCESSFUL
;IN ANY CASE, SWITCH IS UNLOCKED
;ASSUMES ARGS ALREADY SET UP, AND 11CVSR LOCKED.
NVDCMD:	MOVEM C,(I)	;STORE COMMAND-TYPE, TELLING PDP11 TO GO.
NVDCM1:	CAME C,(I)
	 JRST NVDCM2	;IT'S FINISHED, WE WIN.
	SOJG T,NVDCM1	;LOOP FOR A WHILE,
	PUSHJ P,LSWPOP
	JRST (Q)	;FAIL - 11 TIMED OUT

NVDCM2:	MOVE C,1(I)	;RETURNED ARG IN CASE OF ASSIGN VIDEO BUFFER
	LSH C,-4.-16.
	SKIPGE (I)	;PDP11 FINISHED: DID COMMAND SUCCEED?
	 AOS Q		;YES SKIP EXTRA TIME
	SETZM (I)
	PUSHJ P,LSWPOP
	JRST 1(Q)

;LOCK SWITCH AND SET UP.. RETURN TO (Q) IF FAILS (SWITCH NOT LOCKED IN THAT CASE)
;RETURN TO 1(Q) IF SUCEEDS

11CM1:	SKIPL TT11P
	 JRST (Q)
	PUSHJ P,SWTL
	 11CVSR
	LDB T,[061600,,TT11HA]
	LDB I,[061600,,400000+TTPG0*2000(T)]
	ADDI I,400000+TTPG0*2000	;I HAS 10-TO-11 COMMAND BFR ADDR.
	MOVSI T,1	;# TIMES TO LOOP WAITING FOR 11 TO ACKNOWLEDGE
11CM2:	SKIPG (I)
	 JRST 1(Q)	;11 READY FOR COMMAND.
	SOJG T,11CM2
	PUSHJ P,LSWPOP
	JRST (Q)	;TIMED OUT
]

SUBTTL	TABLET AND ROBOT CONSOLE

IFN TABP,[

ITAB:	IFE TABCLK,[
	SOSLE TABRTC
	JRST ITAB6
	SKIPGE TABUSR
	JRST ITAB7
	MOVE A,TABRTE
	MOVEM A,TABRTC
	CONO RBTCON,RTABC_3+TABCHN
]	IFN TABCLK,	CONO RBTCON,RTABC_3
	ROT A,36.*2
	DATAI RBTCON,A
	JUMPL A,ITAB	;TRY AGAIN
	LDB B,[400300,,A]
	CAME B,TABLSZ
	JRST ITAB2
	CAIN B,7
	JRST ITAB3	;PEN OUT OF CONTACT
	LDB B,[221400,,A]	;X
	SUB B,TABLSX
	MOVMS B
	CAML B,TABDTA
	JRST ITAB2
	LDB B,[1400,,A]
	SUB B,TABLSY
	MOVMS B
	CAML B,TABDTA
	JRST ITAB2
ITAB3:	AOS B,TABSMC
	CAIL B,77
	JRST ITAB2
ITAB5:	IFN TABCLK,[
	MOVE T,TABRTE
	MOVEI C,TABQBK
	SKIPL TABUSR
	JRST CLQREE
	JRST CLQRET
]	IFE TABCLK,[
	JRST OMXRET

ITAB6:	DATAI RBTCON,A	;FLUSH DATA
	JRST OMXRET

ITAB7:	CONO RBTCON,0
	JRST OMXRET
]
ITAB2:	MOVE B,TABSMC
	DPB B,[140600,,TABLST]
	SETZM TABSMC
	HRRZM A,TABLSY
	LDB B,[221400,,A]
	MOVEM B,TABLSX
	LDB B,[400300,,A]
	MOVEM B,TABLSZ
	EXCH A,TABLST
	JUMPE A,ITAB5	;JUST STARTING UP
	MOVE B,TABCC
	CAIL B,LTABBF
	JRST ITAB4	;FULL
	MOVEM A,@TABIP
	AOS TABCC
	AOS B,TABIP
	CAIL B,TABBFE
	MOVEI B,TABBUF
	MOVEM B,TABIP
	JRST ITAB5

ITAB4:	MOVSI B,(SETZ)	;SET DATA LOST
	IORM B,TABLST
	JRST ITAB5

]

IFN RBTCP,[

	;ROBOT CONSOLE READ SWITCHES
ARBTC:	UMOVE A,(J)
	CONO PI,TABOFF
	CONO RBTCON,RLTSWC_3+IFE TABCLK,TABCHN
	ROT A,36.*2
	DATAO RBTCON,A
	ROT A,36.*2
	DATAI RBTCON,A
	CONO PI,TABON
	UMOVEM A,(J)
	POPJ P,

;DATA FORM
;4.9 DATA LOST BEFORE THIS
;4.8-4.6 TAB "Z"
;4.5-4.4 USUSED
;4.3-3.1 TABLET X
;2.9-2.4 REPEAT COUNT
;2.4-1.1 TABLET Y

TABO:	PUSH P,[TABO1]
	JSP Q,STDOPN
	1,,TABUSR
	DTABUI,,DTABBI

TABO1:	POPJ P,		;OPEN LOST
	SKIPE TABUSE	;OPEN WON
	JRST POPJ1	;NOT FIRST OPEN
	LDB T,[250300,,C]
	AOS T
	MOVEM T,TABRTE	;TABLET RATE (IGNORE THIS MANY BETWEEN TAKES)
	LDB T,[300600,,C]
	MOVEM T,TABDTA	;DELTA FOR COORD TO BE DIFFERENT
	PUSHJ P,TABCLR
IFE TABCLK,	CONO RBTCON,RTABC_3+TABCHN
IFN TABCLK,[	PUSHJ P,CLQAD1	;START UP CLOCK LEVEL
	TABQBK
]	JRST POPJ1

BTABI:	UMOVE J,(C)	;INITIAL AOBJN PNT
	JSP Q,WRDBT
UTABI:	SKIPG TABCC	;TABLET .IOT
	JRST TABI1	;NO DATA AVAIL, SEE IF BEING ACCUMULATED
UTABI1:	MOVE A,@TABOP
	UMOVEM A,(C)
	AOS T,TABOP
	CAIL T,TABBFE
	MOVEI T,TABBUF
	MOVEM T,TABOP
	SOS TABCC
	POPJ P,

TABI1:	HRRZ T,(P)
	CAIN T,WRDBRT
	JRST TABI2
TABI3:	SKIPG TABCC
	PUSHJ P,UFLS
	JRST UTABI1

TABI2:	XCTR XRW,[CAMN J,(H)]
	JRST TABI3	;NO WDS TRANSFERRED
	SUB P,[1,,1]	;RETURN TO USER SOME HAVE BEEN TRANSFERRED
	POPJ P,

TABCLR:	CONO PI,TABOFF
	SETZM TABCC
	MOVEI T,TABBUF
	MOVEM T,TABIP
	MOVEM T,TABOP
	SETZM TABSMC
	SETZM TABLST
	CLEARM TABLSX
	CLEARM TABLSY
	CLEARM TABLSZ
IFE TABCLK,	SETZM TABRTC
	CONO PI,TABON
	POPJ P,
EBLK

TABBUF:	BLOCK LTABBF
TABBFE:
TABOP:	TABBUF	;OUTPUT PNTR (MP)
TABIP:	TABBUF	;INPUT PNTR (PI)
TABCC:	0	;ACTIVE WDS IN TAB BUFFER
TABSMC:	0	;COUNT OF TIMES "SAME" DATA RECEIVED FOR TAB
TABLST:	0	;LAST DATA
TABLSZ:	0	;Z OF LAST DATA
TABLSX:	0	;X
TABLSY:	0	;Y
TABDTA:	0	;DELTA FOR COORD TO BE DIFFERENT
TABRTE:	0	;TABLET RATE (TAKE EVERY N'TH ONE)
IFN TABCLK,[TABQBK:	0	;CLOCK QUEUE BLOCK
	-1
	JRST ITAB
]
IFE TABCLK,[
TABRTC:	0	;COUNT WITHIN TABRTE
]
	BBLK
]
IFN IMXP,[

SUBTTL	INPUT MULTIPLEXOR ROUTINES

IMPXO:	CONI MPX,T
	JUMPE T,OPNL25
	TRNN D,2
	JRST IMPXO2	;READ AT MN PRGM
	SKIPGE IMPXF	;IMAGE (READ AT PI)
	SETOM MPXWF
	PUSHJ P,IMXON
IMPXO2:	AOS IMXNTO
	HLL A,C
	JSP Q,OPSLD3
	IMXDN,,BIMXDN
	IMPXDN,,BIMPXD

IMXON:	AOSGE IMPXF
	JRST 4,.	;SHOULD NOT HAVE BEEN LESS THAN -1
	PUSHJ P,CLQAD1	;START CLOCK LEVEL
	MPXBLK
	POPJ P,

BIMPXS:	JSP Q,WRDBT
IMPXS:	SKIPGE MPXWF
	PUSHJ P,UFLS
	UMOVE A,(C)
	ANDI A,377
	CAILE A,LCHN
	JRST IMPXS1
AIMXW5:	IDIVI A,3
	LDB A,IMPXT(B)
	UMOVEM A,(C)
	POPJ P,

IMPXCL:	TRNE A,4	;SKIP ON WAS READING AT MP
IMXCL1:	SOS IMPXF	;WAS READING AT PI
	SOSGE IMXNTO
	DATAO DSDEVN,[MPX]
	POPJ P,

IMPXRS:	SETOM MPXWF
	POPJ P,

IMPXT:	301400,,MPXBUF(A)
	141400,,MPXBUF(A)
	1400,,MPXBUF(A)

BIMXS1:	JSP Q,WRDBT
IMPXS1:	UMOVE A,(C)
	TDZE A,[-400]
	JRST IOCER4
AIMXW4:	MOVE T,MPXWF
	CAILE A,LCHN
	MOVNI T,2	;CHNL NOT READ IN BY PI HACK
AIMXW2:	SKIPL IMXSW
	PUSHJ P,UFLS
	CAME T,MPXWF
	AOJGE T,AIMXW3	;PI FROB HAS CYCLED (MAYBE)
	AOSE IMXSW
	JRST AIMXW2	;READING IMX AT PI
	DATAO MPX,A	;SELECT CHNL
	CONO MPX,0	;START CONVERSION
	MOVEI B,62
	CONSO MPX,10
	SOJG B,.-1
	JUMPE B,IMPXFE
	XCTR XRW,[DATAI MPX,(C)]
IMX1:	SETOM IMXSW
	POPJ P,

AIMXW3:	SKIPGE MPXWF
	JRST AIMXW4	;IT WAS JUST SETOMMED
	JRST AIMXW5	;HAS BEEN READ IN BY PI HACK SO GOBBLE DATA

IMPXFE:	XCTR XRW,[SETOM (C)]
	JRST IMX1

IMPXSR:	AOSE IMXSW
	JRST MPXRT1	;USING IMX AT MN PRGM LVL
	MOVE T,[<-LCHN>/3-1,,MPXBUF-1]
	MOVEM T,MPXPTR	;SET UP BLKI POINTER
	MOVE T,[BLKI MPX,MPXPTR]
	MOVEM T,IMXLC	;SET UP DC INTERUPT LOCN
	MOVE T,[JSR MPXCYC]
	MOVEM T,IMXLC+1	;SET UP DC INT LOC+1
	DATAO MPX,[0]	;READ STARTING WITH CHNL 0
	CONO MPX,140+DCCHN
	MOVEI T,5	;12TH SEC
IFN ARMP,SKIPN ARMF
	SKIPL POTCON
	MOVEI T,2	;1/30 SEC, HAIRY POTS
	JRST .+2
MPXRT1:	MOVEI T,1	;LOST RETRY IN 1/60
	MOVEI C,MPXBLK
	SKIPL IMPXF
	JRST CLQREE	;RE-ENTER RQ
	JRST CLQRET	;RETURN

EBLK

OMXNTO:	-1
IMXNTO:	-1
IMPXF:	-1	;-1 IF MPX NOT RUNNING
MPXWF:	0
MPXBLK:	0	;CLOCK QUEUE BLOCK
	-1
	JRST IMPXSR
MPXPTR:	0
IMXST:	0
IMXSW:	-1	;-1 IF IMX AVAIL
IMXTBB:	LCHN
MPXBUF:	BLOCK <LCHN>/3+1
IMXTBE==.-1

IMXACS:	BLOCK 20
MPXCYC:	0

BBLK

	CONO MPX,0
	SETOM IMXSW
	AOS MPXWF
	MOVEM T,IMXST
	MOVE T,[JSR MPXCYC]
	MOVEM T,IMXLC
	MOVE T,IMXST
;	SKIPGE POTCON
;	SKIPE ARMF
;	JRST MPXCYG
	JRST 12,@MPXCYC

MPXCYG:	MOVEM 17,IMXACS+17
	MOVEI 17,IMXACS
	BLT 17,IMXACS+16
IFN ARMP,[
	SKIPE ARMF
	JRST SERVO
ARMSVR:]
	SKIPL POTCON
	JRST UPOTS
UPOTRT:	MOVSI 17,IMXACS
	BLT 17,17
	JRST 12,@MPXCYC
]
IFN OMXP,[

SUBTTL	OUTPUT MULTIPLEXOR ROUTINES

OMPXO:	CONI OMPX,T
	JUMPE T,OPNL25
	AOS OMXNTO
	HLL A,C
	JSP Q,OPSLD3
	OMPXDN,,BOMPXDN
	OMXDN,,BOMXDN

BOMXDS:
BOMPXS:	JSP Q,WRDBT
OMXDS:
OMPXS:	XCTR XRW,[DATAO OMPX,(C)]	;ZAP CHNL
	POPJ P,

OMPXCL:	SOSGE OMXNTO
	DATAO DSDEVN,[OMPX]
	POPJ P,

EBLK
OMXACS:	BLOCK 20

OMPXBK:	0
BBLK
	MOVEM 17,OMXACS+17
	MOVEI 17,OMXACS
	BLT 17,OMXACS+16
IFN VIDP,[
	CONSZ NVDX,700000
	CONSO NVDX,1000
	JRST .+2
	JRST NVDBRK
]
IFN ARMP,[
	CONSZ TIPDEV,10
	JRST TIPBRK
]
IFN TABP,[
	CONSZ RBTCON,7
	CONSO RBTCON,10
	JRST .+2
	JRST ITAB
]
;	MOVEI J,OMPCHN
;	JSP E,SPUR	;SPURIOUS INT
OMXRET:	MOVSI 17,OMXACS
	BLT 17,17
	JRST 12,@OMPXBK
]

SUBTTL	MORSE CODE SENDER (COD DEVICE)

IFN CODP,[
;	CODITC==CODBFL*5-1	;WHEN TO TRY TO INTERRUPT

CLKCOD:	SETOM TT	;USED AS A FLAG
	MOVE B,CODWD
	LSH B,-1
CLKCC3:	CAIN B,1
	JRST CLKCC1
	LDB A,[100,,B]
	EXCH A,LSTBIT
	CAME A,LSTBIT
	DATAO 70,LSTBIT
	MOVEM B,CODWD
	MOVE T,CODSPD
	MOVEI C,CODTIM
	JRST CLQTTR	;RE-ENTER OR NOT DEPENDING ON TT

CLKCC1:	MOVE A,CODCC
	CAIL A,CODBFL*5
	JRST CLKCC5
CLKCC8:	AOS CODCC
	ILDB B,CODPTR
	MOVE A,CODPTR
	CAMN A,[10700,,CODBUF+CODBFL-1]
	HRRI A,CODBUF-1
	HRRM A,CODPTR
	CAIL B,140
	JRST CLKCC2
	CAIGE B,40
	JRST CLKCC1
	MOVE B,CODTBL-40(B)
	JRST CLKCC3
CLKCC6:	MOVE B,CDRUB
	JRST CLKCC3
CLKCC2:	CAIN B,177
	JRST CLKCC6
	SUBI B,137
	MOVEM B,CODSPD
	JRST CLKCC1

CLKCC5:
;	CAIN A,CODITC
;	JRST CLKCC7
	MOVEI B,2
	SETZM TT	;INDICATE IDLE
	JRST CLKCC3

;CLKCC7:	MOVE A,CODUSR	;GET INDEX OF USER
;	MOVE B,CODITB	;GET CHANNELS OPEN MASK
;	AND B,MSKST2(A)	;FIND OUT WHAT CODE CHANNELS ENABLED,
;	MOVNM B,CODITD
;	AND B,CODITD
;	IORM B,IFPIR(A)	;AND REQUEST INTERRUPT ON LOWEST NUMBERED ONE
;	JRST CLKCC8	;SEND REMAINING CHARACTER(S) IN BUFFER

	;RETURN HERE FROM STDOPN
CODO1:	POPJ P,		;NON-SKIP RETURN
	AOS (P)		;DO NOT CHANGE TO JRST POPJ1 AT END
	MOVEI I,1	;INDICATE "IOPOP"

	;CODE DEVICE IOPUSH AND IOPOP ROUTINE (SETS INTERRUPT MASK)

CODIOP:	SUBI R,IOCHNM(U)	;GET "AC FIELD" (ROUTINES THAT NEED IT RESTORE R)
	MOVE A,CHNBIT(R)	;SET UP INTERRUPT BIT
	XCT CDPTBL(I)	;IORM OR ANDCAM TO CODITB
	POPJ P,

CDPTBL:	ANDCAM A,CODITB	;IOPUSH AND CLOSE
	IORM A,CODITB	;IOPOP AND OPEN

	;COD CLOSE ROUTINE
CODCLS:	MOVEI I,0	;TO SIMULATE IOPUSH
	PUSHJ P,CODIOP	;CLEAR RELEVANT INTERRUPT BIT
	CONO PI,CLKOFF	;CLOSE, USE STANDARD SEQUENCE
	SOSGE CODUSE
	SETOM CODUSR
	JRST CLKONJ

SEND:	SKIPGE C
	 SKIPA A,(C)
	  XCTR XRW,[MOVE A,(C)]	;UNIT OUTPUT
	CAIA
BSEND:	 JSP E,NBTOCH	;BLOCK OUTPUT
	ANDI A,177
	CAIN A,"S-100
	 JRST CODSSS
	SKIPE CODSSF
	 JRST CODSST
	SKIPG CODCC	;WAIT FOR ROOM
	 PUSHJ P,UFLS
	IDPB A,CODIPT
	MOVE A,CODIPT
	CAMN A,[10700,,CODBUF+CODBFL-1]
	 HRRI A,CODBUF-1
	HRRM A,CODIPT
	SOS CODCC
	MOVE T,CODSPD
	PUSHJ P,CLQADD	;START UP CLOCK LEVEL
	 CODTIM
	POPJ P,

CODO:	PUSH P,[CODO1]	;CODO1 SETS UP INTERRUPT BIT
	JSP Q,STDOPN
	1,,CODUSR
	CODDN,,CODBN


CODSSS:	SETOM CODSSF
	POPJ P,

CODSST:	SETZM CODSSF
	SUBI A,137
	JUMPLE A,CPOPJ
	MOVEM A,CODSPD
	POPJ P,

CODRS:	CONO PI,CLKOFF
	MOVEI A,CODBFL*5
	MOVEM A,CODCC
	MOVE A,CODIPT
	MOVEM A,CODPTR
	JRST CLKONJ

CODFIN:	MOVE T,CODBFL*5	;.CALL FINISH
	CAMLE T,CODCC
	 PUSHJ P,UFLS
	POPJ P,

EBLK
CODITB:	0	;MASK OF CHANNELS OPEN, 1.1=>0
CODITD:	0	;RANDOM SCRATCH LOCATION
CODWD:	2	;CURRENT WORD
CODTIM:	0	;CLOCK QUEUE BLOCK
	-1
	JRST CLKCOD
CODSPD:	3	;CODE SPEED (SET FROM CHARS >=140) WPM= 75./(CODSPD)
CODCC:	CODBFL*5
CODPTR:	440700,,CODBUF
CODIPT:	440700,,CODBUF
LSTBIT:	0	;FLUSH 60 CPS CHIRPS
CODSSF:	0

CODBUF:	BLOCK CODBFL
BBLK

DEFINE GCODE A
BIT=1
WRD=0
IRPC B,,[A]
IFSE B,-,[WRD=WRD+7*BIT
BIT=BIT_4]
IFSE B,.,[WRD=WRD+BIT
BIT=BIT_2]
IFSE B, ,[BIT=BIT_2]
TERMIN
WRD+4*BIT
TERMIN

CODTBL:	20
	GCODE -.-.-
	GCODE .-..-.
	GCODE -. .-.
	REPEAT 2,1
	GCODE . ...
	GCODE .----.
	REPEAT 2,GCODE -.--.-
	GCODE .-.-
	GCODE . ...
	GCODE --..--
	GCODE -....-
	GCODE .-.-.-
	GCODE -..-.
	IRP A,,[-----,.----,..---,...--,....-,.....,-....,--...,---..,----.]
	GCODE A
	TERMIN
	GCODE ---...
	GCODE -.-.-.
	27727	;K WITH LONG LAST DAH
	GCODE -...-
	GCODE ...-.-
	GCODE ..--..
	GCODE ...-.
	IRP A,,[.-,-...,-.-.,-..,.,..-.,--.,....,..,.---,-.-,.-..,--,-.,---,.--.,--.-
.-.,...,-,..-,...-,.--,-..-,-.--,--..]
	GCODE A
	TERMIN
	GCODE -.--.
	GCODE -.-..-..
	GCODE .-.-.
	GCODE .-...
	GCODE -.. .

CDRUB:	GCODE ........

EXPUNGE WRD,BIT

]
IFN PLTP,[

SUBTTL	CALCOMP PLOTTER ROUTINES

PLOT:	SKIPGE C
	 SKIPA A,(C)
	  UMOVE A,(C)	
PLOT1:	SKIPE A
	CAIN A,EOFCH
	POPJ P,
	SKIPG PLBFS
	JRST PLOTW1
PLOTW2:	IDPB A,PLPTR
	MOVE  A,PLPTR
	CAMN A,[600,,PLBUF+LPLBUF-1]
	HRRI A,PLBUF-1
	HRRM A,PLPTR
	SOS PLBFS
	AOSN PLON
	CONO PLT,SDS+PLTCHN
	POPJ P,

	PUSHJ P,PLOTW3
PLOTW1:	PUSHJ P,UFLS
	JRST PLOTW2

PLOTW3:	SKIPG T,PLBFS
	POPJ P,
	CAIL T,LPLBUF*5
	JRST POPJ1
	JRST POPJ3

BPLOT:	MOVEI E,PLOT1
	JRST NBTOCH

PLOTO:	MOVEI Q,PLOTOC
	PUSHJ P,STDOPN
	 POPJ P,
	AOS (P)
PLOTEL:	;TELL WHO'S USING THE PLOTTER
	BUG INFO,[PLOTTER USER],SIXBIT,UNAME(U),SIXBIT,JNAME(U)
	POPJ P,

PLOTOC:	1,,PLTUSR
	PLTDN,,PLTBN

PLTRS:	MOVEI A,LPLBUF*6
	MOVE B,PLPTR
	CONO PI,LPTOFF
	MOVEM A,PLBFS
	MOVEM B,PLIPTR
	JRST LPTONJ

PLTBRK:	MOVE A,PLBFS
	CAIN A,LPLBUF*6
	JRST PLSTP
	AOS PLBFS
	ILDB A,PLIPTR
	MOVE B,PLIPTR
	CAMN B,[600,,PLBUF+LPLBUF-1]
	HRRI B,PLBUF-1
	HRRM B,PLIPTR
	ANDI A,77
	LSH A,3
	TRO A,SDC+PDC+SD+PLTCHN
	TRNE A,PUP+PDN
	TRC A,SD#PD
	CONO PLT,(A)
	JRST LPTRT3


PLSTP:	CONO PLT,SDC+PDC
	SETOM PLON
	JRST LPTRT3

EBLK
PLBUF:	BLOCK LPLBUF
PLON:	-1
PLPTR:	440600,,PLBUF
PLIPTR:	440600,,PLBUF
PLBFS:	LPLBUF*6
IPL:	SIXBIT /IPL/	;FILE NAME 2 OF IPL JOB (USED FOR LOADING ASO JNAME OF IPL JOB)
IPLU:	0	;USER INDEX OF IPL JOB IF IT EXISTS OR -1 IF IPL BEING LOADED

;INTERPRET PLOTTER OPEN ROUTINE
BBLK
IPLO:	CONO PI,CLKOFF
	PUSHJ P,IPLST	;INITIATE LOADING OF IPL JOB
	 JRST IPLO1
	PUSHJ P,PLOTEL
	CONO PI,CLKOFF
	PUSHJ P,IPLWT	;WAIT FOR IPL JOB TO FINISH LOADING
	PUSHJ P,UFLS
	MOVE T,IPLU	;INDEX OF IPL JOB
	SKIPE IOCHNM(T)
	JRST IPLO2	;IPL JOB OPNS CLA ON CNNL 0
	MOVE T,SV40(T)
	CAME T,[.SLEEP 17,]	;IPL JOB DOES SLEEP 17, WHEN READY
IPLO2:	JRST OPNL10	;DEVICE NOT AVAILABLE
	CONO PI,CLKON
	MOVE T,IPLU
	MOVE A,UNAME(T)	;SET UP CLI OPEN
	MOVSI B,(SIXBIT /IPL/)
	PUSHJ P,CLIO
	POPJ P,
	MOVE A,UTMPTR(U)
	MOVE B,IPLU
	MOVEM A,UTMPTR(B)
	JRST POPJ1

IPLO1:	PUSHJ P,UDELAY
	JRST IPLO

IPLST:	SKIPL T,IPLU	;MAKE SURE IPL JOB NOT ALREADY BEING LOADED
	PUSHJ P,IPLIN	;MAKE SURE IPL JOB NOT ALREADY IN
	JRST POPJ1	;DONT LOAD
	HRROI T,IPL
	CONO PI,UTCOFF
	PUSHJ P,NUJBST
	JRST UTCONJ
	JRST UTCOJ1

;ROUTINE TO SEE IF IPL JOB WINS. CLKOFF OR CLKBRK IN PROGRESS
IPLWT:	SKIPGE T,IPLU	;CHECK IPL JOB LOADING FLAG
	POPJ P,	;IPL JOB STILL LOADING WAIT
	PUSHJ P,IPLIN	;SEE IF IPL JOB IN CORE
	SKIPE IOCHNM(T)	;SEE IF IPL JOB IN USE
	JRST POPJ1	;LOSE
	MOVE T,SV40(T)	;SEE IF IPL JOB READY
	CAMN T,[.SLEEP 17,]	;IPL JOB DOES .SLEEP 17, WHEN READY
	AOS (P)	;READY WIN
	POPJ P,	;NOT READY YET, WAIT

IPLIN:	PUSH P,U	;ROUTINE TO SEE IF IPL JOB IN. C(T)=C(IPLU), CLKOFF OR CLKBRK IN PROGRESS
	CAML T,USRHI
	JRST IPLIN1	;USER VARIABLES SLOT FLUSHED
	HLRO U,UNAME(T)
	AOJN U,IPLIN1	;UNAME OF IPL JOB IS -1 (IN LH)
	MOVSI U,(SIXBIT /IPL/)
	CAME U,JNAME(T)
IPLIN1:	AOS -1(P)	;IPL JOB NOT IN, SO SKIP
	POP P,U
	POPJ P,

]
;UTC MUST BE OFF!
NUJBST:	MOVEI TT,MXCZS	;ENTRY FROM ELSEWHERE TO DO SIMILAR THINGS
	SKIPL DEDTIM	;SKIP IF SYS DEAD
	CAMG TT,UTTYCT
	 POPJ P,	;RING BUFFER FULL, WAIT
	MOVEM T,@UTTYI
	AOS UTTYCT
	AOS TT,UTTYI
	CAIL TT,UTTYS+MXCZS
	MOVEI TT,UTTYS
	MOVEM TT,UTTYI
	SETOM 1(T)	;SET JOB LOADING FLAG
	JRST POPJ1

SUBTTL	PDP-6 AS INFERIOR

IFN PDP6P,[
;.IPDP CH,
;INTERRUPT THE PDP6, I/O CH SHOULD HAVE PDP6 OPEN AS INFERIOR
;THIS CALL DOESNT SKIP OR INTERRUPT TO THE USER

AIPDP:	MOVSI T,%CLS6
	SKIPGE A,(R)
	 TDNN T,CLSTB(A)
	  POPJ P,
	CONO PI,LPTOFF
	CONI DSDEV,T
	ANDI T,7
	CONO DSDEV,20(T)
	JRST LPTONJ

;PDP-6 DEVICE
;INTERRUPT FROM PDP6, MAYBE GENERATE IO CHANNEL USER INTERRUPT

DSDBRK:	CONO DSDEV,10	;TURN OFF FLAG
			;ALSO KEEP IT FROM INTERRUPTING FOR A WHILE
			;GETS TURNED ON AT DISMISS, SETOM PICLR AND SLOW CLK
	SKIPGE A,PDPISR
	 JRST LPTRT3	;NO ONE WANTS AN INT
	MOVE B,PDPMSK
	AND B,MSKST2(A)
	MOVNM B,PDPTMP
	AND B,PDPTMP
	IORM B,IFPIR(A)	;GENERATE USER INT
	JRST LPTRT3

		;PDP6 .OPEN ROUTINE (GET HERE FROM USR OPEN)

PDPO:	SKIPL PDP6UP	;MAKE IT EASY TO MARK PDP6 AS DOWN.
	 JRST OPNL10
	TLNN C,20
	 JRST PDPO1	;DON'T TRY TO ENABLE INTERRUPTS
	TLO C,400000	;TRY TO ENABLE INTERRUPTS
	SKIPL PDPISR
	 CAMN U,PDPISR
	  JRST PDPO1
	JRST OPNL12

PDPO1:	PUSH P,U
	PUSHJ P,PDPO2
	 JRST POPUJ
	AOS -1(P)
	POP P,U
	SKIPL (R)
	 JRST .+3
	  AOS PDPISE
	  MOVEM U,PDPISR;GOT IT AS INFERIOR
	PUSHJ P,LSWPOP	;RELEASE TREESW
	MOVEI I,1	;DO "IOPOP" INTO CHNL

PDPIOP:	SKIPL (R)
	 POPJ P,	;NOT OPEN TO INTERRUPT
	SUBI R,IOCHNM(U)
	MOVE A,CHNBIT(R)
	ADDI R,IOCHNM(U)	;RESTORE R
	XCT PDPIOT(I)
	POPJ P,

PDPIOT:	ANDCAM A,PDPMSK
	IORM A,PDPMSK

PDPCLS:	MOVEI I,0	;CLOSE
	PUSHJ P,PDPIOP	;=> DO "IOPUSH"
PDPCL1:	CONO PI,CLKOFF
	SOSGE PDPUSE
	 SETOM PDPUSR	;LAST CHANNEL CLOSED
	SKIPL (R)
	 JRST CLKONJ	;NOT INTERRUPT ENABLED THIS CHNL
	SOSGE PDPISE
	 SETOM PDPISR	;LAST CHANNEL CLOSED
	JRST CLKONJ


PDPO3:	MOVEI U,(A)	;MAKE U INDEX OF SUPERIOR
PDPO2:	SKIPL A,SUPPRO(U)	;GET POINTER TO SUPERIOR, SKIP IF TOP LEVEL
	 JRST PDPO3	;TRY AGAIN
	HLRZ D,C
	TLO C,200000	;SIGNAL PDP6 TO UBI ETC
	JSP Q,STDOPN
	 3,,PDPUSR
	 PDPUII,,PDPUIO
	 PDPBII,,PDPBIO

;.UCLOSE PDP6
PDPUCL:	MOVSI C,%CLS6	;GET PDP6 CLSTB BIT
	MOVEI R,IOCHNM(U)	;GET PNTR TO USER'S IO CHNL AREA
	HRLI R,-20	;MAKE AOBJN PNTR TO ALL CHNLS
	PUSHJ P,PDPCCK	;CHECK CHNL
	 PUSHJ P,PDPCZP	;CLOSE CHNL IF PDP6 OPEN ON IT
	AOBJN R,.-2	;REPEAT FOR ALL CHNLS
	HRLI R,-LUIOP/2	;MAKE AOBJN PNTR TO IO PDL (ADR ALREADY THERE)
	PUSHJ P,PDPCCK	;CHECK ENTRY FOR PDP6
	 PUSHJ P,PDPPZP	;CLEAR ENTRY IF PDP6 CHNL
	AOJ R,		;INCR TO SKIP IOCHST ENTRY
	AOBJN R,.-3	;REPEAT FOR WHOLE IO PDL
	POPJ P,		;ALL PDP6 CHNLS THIS JOB SHOULD NOW BE CLOSED

PDPCCK:	HRRZ B,(R)	;GET CLSTB INDEX FROM IOCHNM
	TDNN C,CLSTB(B)	;IF NOT PDP6 CHNL
	 AOS (P)	;SKIP CLOSING CHNL
	POPJ P,

;CLOSE PDP6 USER CHNL
PDPCZP:	PUSHJ P,PDPCLS	;ADJUST PDP6 VARS
	JRST STDCLX	;CLOBBER CHNL & RETURN

;CLEAR PDP6 IO PDL ENTRY
PDPPZP:	PUSHJ P,PDPCL1	;ADJUST PDP6 VARS (EXCEPT PDPMSK)
	SETZB A,(R)	;CLEAR SAVED IOCHNM
	DPB A,[4000,,1(R)]	;CLEAR SAVED IOCHST (SAVING CHNL # FOR .IOPDL)
	POPJ P,
PDPCLR:	OFFSET 20-.	;ROUTINE TO BE MOVED
	CONO PI,11577	;CLEAR PI
	CONO 655550	;CLEAR PROCESSOR
	DATAO 20,.+1	;RELEASE DEVICES
	SETZ		;CLEAR 0, ALSO BIT FOR DEASSIGNMENT (^)
	HRRZI 1,1	;BLT POINTER 0,,1
	BLT 1,41		;CLEAR AC'S, SELF, AND 41
PDPCLE==.
	OFFSET 0	;BACK TO NORMAL
EBLK

PDPTMP:	0	;TEMP FOR INT
PDPMSK:	0	;MASK OF INT BITS OF CHNLS OPEN

BBLK

PDPRST:	PUSHJ P,MP6LD
	MOVE C,[400020,,400021]
	XCTR XW,[CLEARM 400020]
	XCTR XBRW,[BLT C,437777]
	MOVE C,[PDPCLR,,400020]
	XCTR XBW,[BLT C,400000+PDPCLE-1]
	MOVE C,[JRST 20]
	UMOVEM C,400041
	PUSHJ P,UDELAY
	UMOVE A,400041
	JUMPE A,PDPRS2	;JUMP ON ROUTINE WON, DON'T HAVE TO CLEAR IT OUT
	XCTR XW,[CLEARM 400020]
	MOVE C,[400020,,400021]
	XCTR XBRW,[BLT C,400041]
PDPRS2:	JRST MPLDZ
];IFN PDP6P

SUBTTL	DL10MP SYSTEM CALL

IFN DL10P,[
;.CALL DL10MP
;  ARG 1 - PAGE #
;CREATES A READ/WRITE, UNENCACHED, ABSOLUTE PAGE AT THAT POINT
;IN THE USER'S MAP.  THE PAGE CONTAINS THE DL10 CONTROL AREA.
;  VAL 1 - AOBJN POINTER TO DL10 CONTROL AREA WITHIN PAGE
;  VAL 2 - POINTER TO 3 WORDS USED FOR PDP11 EXAMINE/DEPOSIT COMMANDS
;  VAL 3 - POINTER TO FIRST FREE WORD WITHIN DL10 CONTROL AREA

DL10MP:	TDNE A,[-400]
	 JRST OPNL33		;PAGE NUMBER TOO BIG
	PUSHJ P,UPLC
	LDB C,Q			;GET CIRC POINTER
	CAIE C,-1
	 JUMPN C,OPNL13		;PAGE SLOT ALREADY IN USE
	BUG INFO,[DL10MP BY],SIXBIT,UNAME(U),SIXBIT,JNAME(U)
	MOVEI C,600000+<DL10AR_-10.>	;SUITABLE PTW
	DPB C,T
	MOVEI C,-1		;ABS CIRC PNTR
	DPB C,Q
	CLRPGM (U)
	LSH A,10.		;USER'S VIRTUAL ADDRESS
	ADDI A,2000
	CAMLE A,HUSRAD(U)
	 MOVEM A,HUSRAD(U)
	SUBI A,2000-<DL10AR&1777>	;VIR ADDR OF START OF DL10 CONTROL AREA
	HRLI A,-100		;SIZE OF DL10 CONTROL AREA
	MOVEI B,DL10XD-DL10AR(A)
	MOVEI C,DLXEND-DL10AR(A)
	JRST POPJ1
];DL10P

SUBTTL	TRAP DEVICE

;.CALL TRPOPN
;  ARG 1 - <JOB> SPEC
;  ARG 2 - CHANNEL NUMBER IN THAT JOB TO BE OPENED AS TRAP DEVICE
;  ARG 3 - IOCHNM WORD (ONLY LH IS USED)
;  ARG 4 - IOCHST WORD
;THIS GIVES THE INFERIOR A TRAP DEVICE CHANNEL, WHICH GIVES
;A %PITRP INTERRUPT ON MOST OPERATIONS.  THE INFERIOR SIGNALS
;ITS DESIRE TO GET SUCH A CHANNEL BY OPENING THE TRAP DEVICE,
;WHICH ALSO GIVES A %PITRP INTERRUPT.
;TRPOPN IS ALSO USEFUL FOR STORING ERROR CODES INTO IOCHST OF AN ALREADY-OPEN TRAP CHANNEL

TRPOPN:	TDNE B,[-NIOCHN]
	 JRST OPNL14		;BAD CHANNEL NUMBER
	MOVE J,A
	JSP T,NCORUI
	 JFCL
IFN PDP6P,[
	CAIN J,-1
	 JRST OPNL34
];PDP6P
	JSP T,NCORWR
	 JRST OPNL31		;CAN'T MODIFY JOB
	ADDI B,IOCHNM(J)	;GET IOCHNM WORD ADDRESS
	HRRZ T,(B)
	CAIE T,DNTRAP
	 JUMPN T,OPNL13		;FILE ALREADY EXISTS (YOU MUST CLOSE THE CHANNEL FIRST)
	HRRI C,DNTRAP
	MOVEM C,(B)
	MOVEM D,IOCHST-IOCHNM(B)
	JRST LSWPJ1		;UNLOCK DIELOK, TAKE SUCCESS RETURN
